@@ -803,7 +803,8 @@ static void _tcp_updateSendWindow(TCP* tcp) {
803803 tcp -> send .window = (guint32 )MIN (tcp -> cong .cwnd , (gint )tcp -> receive .lastWindow );
804804}
805805
806- static Packet * _tcp_createPacket (TCP * tcp , enum ProtocolTCPFlags flags , gconstpointer payload , gsize payloadLength ) {
806+ static Packet * _tcp_createPacket (TCP * tcp , enum ProtocolTCPFlags flags , PluginVirtualPtr payload ,
807+ gsize payloadLength ) {
807808 MAGIC_ASSERT (tcp );
808809
809810 /*
@@ -856,7 +857,7 @@ static void _tcp_sendControlPacket(TCP* tcp, enum ProtocolTCPFlags flags) {
856857 tcp -> super .boundString , tcp -> super .peerString );
857858
858859 /* create the ack packet, without any payload data */
859- Packet * control = _tcp_createPacket (tcp , flags , NULL , 0 );
860+ Packet * control = _tcp_createPacket (tcp , flags , ( PluginVirtualPtr ){ 0 } , 0 );
860861
861862 /* make sure it gets sent before whatever else is in the queue */
862863 packet_setPriority (control , 0.0 );
@@ -1096,7 +1097,7 @@ static void _tcp_sendShutdownFin(TCP* tcp) {
10961097
10971098 if (sendFin ) {
10981099 /* send a fin */
1099- Packet * fin = _tcp_createPacket (tcp , PTCP_FIN , NULL , 0 );
1100+ Packet * fin = _tcp_createPacket (tcp , PTCP_FIN , ( PluginVirtualPtr ){ 0 } , 0 );
11001101 _tcp_bufferPacketOut (tcp , fin );
11011102 _tcp_flush (tcp );
11021103
@@ -2195,8 +2196,8 @@ static void _tcp_endOfFileSignalled(TCP* tcp, enum TCPFlags flags) {
21952196 }
21962197}
21972198
2198- static gssize _tcp_sendUserData (Transport * transport , gconstpointer buffer ,
2199- gsize nBytes , in_addr_t ip , in_port_t port ) {
2199+ static gssize _tcp_sendUserData (Transport * transport , PluginVirtualPtr buffer , gsize nBytes ,
2200+ in_addr_t ip , in_port_t port ) {
22002201 TCP * tcp = _tcp_fromLegacyDescriptor ((LegacyDescriptor * )transport );
22012202 MAGIC_ASSERT (tcp );
22022203
@@ -2226,7 +2227,8 @@ static gssize _tcp_sendUserData(Transport* transport, gconstpointer buffer,
22262227 gsize copyLength = MIN (maxPacketLength , remaining );
22272228
22282229 /* use helper to create the packet */
2229- Packet * packet = _tcp_createPacket (tcp , PTCP_ACK , buffer + bytesCopied , copyLength );
2230+ Packet * packet = _tcp_createPacket (
2231+ tcp , PTCP_ACK , (PluginVirtualPtr ){.val = buffer .val + bytesCopied }, copyLength );
22302232 if (copyLength > 0 ) {
22312233 /* we are sending more user data */
22322234 tcp -> send .end ++ ;
@@ -2262,9 +2264,8 @@ static void _tcp_sendWindowUpdate(TCP* tcp, gpointer data) {
22622264 tcp -> receive .windowUpdatePending = FALSE;
22632265}
22642266
2265- static gssize _tcp_receiveUserData (Transport * transport , gpointer buffer ,
2266- gsize nBytes , in_addr_t * ip ,
2267- in_port_t * port ) {
2267+ static gssize _tcp_receiveUserData (Transport * transport , PluginVirtualPtr buffer , gsize nBytes ,
2268+ in_addr_t * ip , in_port_t * port ) {
22682269 TCP * tcp = _tcp_fromLegacyDescriptor ((LegacyDescriptor * )transport );
22692270 MAGIC_ASSERT (tcp );
22702271
@@ -2280,7 +2281,6 @@ static gssize _tcp_receiveUserData(Transport* transport, gpointer buffer,
22802281 _tcp_flush (tcp );
22812282
22822283 gsize remaining = nBytes ;
2283- gsize bytesCopied = 0 ;
22842284 gsize totalCopied = 0 ;
22852285 gsize offset = 0 ;
22862286 gsize copyLength = 0 ;
@@ -2291,7 +2291,7 @@ static gssize _tcp_receiveUserData(Transport* transport, gpointer buffer,
22912291 return - EWOULDBLOCK ;
22922292 }
22932293
2294- if (buffer == NULL && nBytes > 0 ) {
2294+ if (buffer . val == 0 && nBytes > 0 ) {
22952295 info ("Can't recv >0 bytes into NULL buffer on socket" );
22962296 return - EFAULT ;
22972297 }
@@ -2303,7 +2303,12 @@ static gssize _tcp_receiveUserData(Transport* transport, gpointer buffer,
23032303 utility_assert (partialBytes > 0 );
23042304
23052305 copyLength = MIN (partialBytes , remaining );
2306- bytesCopied = packet_copyPayload (tcp -> partialUserDataPacket , tcp -> partialOffset , buffer , copyLength );
2306+ gssize bytesCopied =
2307+ packet_copyPayload (tcp -> partialUserDataPacket , tcp -> partialOffset , buffer , copyLength );
2308+ if (bytesCopied < 0 ) {
2309+ // Error writing to PluginVirtualPtr
2310+ return bytesCopied ;
2311+ }
23072312 totalCopied += bytesCopied ;
23082313 remaining -= bytesCopied ;
23092314 offset += bytesCopied ;
@@ -2329,19 +2334,30 @@ static gssize _tcp_receiveUserData(Transport* transport, gpointer buffer,
23292334
23302335 /* get the next buffered packet - we'll always need it.
23312336 * this could mark the socket as unreadable if this is its last packet.*/
2332- Packet * packet = socket_removeFromInputBuffer ((Socket * )tcp );
2333- if (! packet ) {
2337+ const Packet * nextPacket = socket_peekNextInPacket ((Socket * )tcp );
2338+ if (! nextPacket ) {
23342339 /* no more packets or partial packets */
23352340 break ;
23362341 }
23372342
2338- guint packetLength = packet_getPayloadLength (packet );
2343+ guint packetLength = packet_getPayloadLength (nextPacket );
23392344 copyLength = MIN (packetLength , remaining );
2340- bytesCopied = packet_copyPayload (packet , 0 , buffer + offset , copyLength );
2345+ gssize bytesCopied = packet_copyPayload (
2346+ nextPacket , 0 , (PluginVirtualPtr ){.val = buffer .val + offset }, copyLength );
2347+ if (bytesCopied < 0 ) {
2348+ // Error writing to PluginVirtualPtr
2349+ if (totalCopied > 0 ) {
2350+ warning ("Returning error %s, but already copied %lu bytes which will be lost" ,
2351+ g_strerror (- bytesCopied ), totalCopied );
2352+ }
2353+ return bytesCopied ;
2354+ }
23412355 totalCopied += bytesCopied ;
23422356 remaining -= bytesCopied ;
23432357 offset += bytesCopied ;
23442358
2359+ Packet * packet = socket_removeFromInputBuffer ((Socket * )tcp );
2360+
23452361 if (bytesCopied < packetLength ) {
23462362 /* we were only able to read part of this packet */
23472363 tcp -> partialUserDataPacket = packet ;
0 commit comments