]> git.meshlink.io Git - utcp/commitdiff
Fix handling packets partially overlapping the start of the receive buffer.
authorGuus Sliepen <guus@meshlink.io>
Sun, 2 Jul 2017 19:35:55 +0000 (21:35 +0200)
committerGuus Sliepen <guus@meshlink.io>
Sun, 2 Jul 2017 19:35:55 +0000 (21:35 +0200)
utcp.c

diff --git a/utcp.c b/utcp.c
index 6b882c6f4cd4a0a888aff9dfafe18d080681dc5c..0cb68b9da7195495602c1c196c835f2cab46d7b2 100644 (file)
--- a/utcp.c
+++ b/utcp.c
@@ -890,14 +890,15 @@ ssize_t utcp_recv(struct utcp *utcp, const void *data, size_t len) {
 
                // cut already accepted front overlapping
                if(rcv_offset < 0) {
 
                // cut already accepted front overlapping
                if(rcv_offset < 0) {
-                       acceptable = rcv_offset + len >= 0;
+                       acceptable = len > -rcv_offset;
                        if(acceptable) {
                                data -= rcv_offset;
                                len += rcv_offset;
                        if(acceptable) {
                                data -= rcv_offset;
                                len += rcv_offset;
+                               hdr.seq -= rcv_offset;
                        }
                        }
+               } else {
+                       acceptable = seqdiff(hdr.seq, c->rcv.nxt) >= 0 && seqdiff(hdr.seq, c->rcv.nxt) + len <= c->rcvbuf.maxsize;
                }
                }
-
-               acceptable = seqdiff(hdr.seq, c->rcv.nxt) >= 0 && seqdiff(hdr.seq, c->rcv.nxt) + len <= c->rcvbuf.maxsize;
        }
 
        if(!acceptable) {
        }
 
        if(!acceptable) {
@@ -905,9 +906,8 @@ ssize_t utcp_recv(struct utcp *utcp, const void *data, size_t len) {
                // Ignore unacceptable RST packets.
                if(hdr.ctl & RST)
                        return 0;
                // Ignore unacceptable RST packets.
                if(hdr.ctl & RST)
                        return 0;
-               // Otherwise, send an ACK back in the hope things improve.
-               ack(c, true);
-               return 0;
+               // Otherwise, continue processing.
+               len = 0;
        }
 
        c->snd.wnd = hdr.wnd; // TODO: move below
        }
 
        c->snd.wnd = hdr.wnd; // TODO: move below