]> git.meshlink.io Git - utcp/blobdiff - utcp.c
Fix handling retransmitted data when the receive buffer is full.
[utcp] / utcp.c
diff --git a/utcp.c b/utcp.c
index bb29de5824a923a89c3cb28dd110190c199d2d66..6b882c6f4cd4a0a888aff9dfafe18d080681dc5c 100644 (file)
--- a/utcp.c
+++ b/utcp.c
@@ -142,16 +142,12 @@ static int32_t seqdiff(uint32_t a, uint32_t b) {
 
 // Store data into the buffer
 static ssize_t buffer_put_at(struct buffer *buf, size_t offset, const void *data, size_t len) {
-       if(buf->maxsize <= buf->used)
-               return 0;
-
        debug("buffer_put_at %lu %lu %lu\n", (unsigned long)buf->used, (unsigned long)offset, (unsigned long)len);
 
        size_t required = offset + len;
        if(required > buf->maxsize) {
                if(offset >= buf->maxsize)
                        return 0;
-               abort();
                len = buf->maxsize - offset;
                required = buf->maxsize;
        }
@@ -647,8 +643,11 @@ cleanup:
  */
 static void sack_consume(struct utcp_connection *c, size_t len) {
        debug("sack_consume %lu\n", (unsigned long)len);
-       if(len > c->rcvbuf.used)
-               abort();
+       if(len > c->rcvbuf.used) {
+               debug("All SACK entries consumed");
+               c->sacks[0].len = 0;
+               return;
+       }
 
        buffer_get(&c->rcvbuf, NULL, len);