View | Details | Raw Unified | Return to bug 245653
Collapse All | Expand All

(-)devel/libuv/files/patch-src_unix_udp.c (+31 lines)
Line 0 Link Here
1
--- src/unix/udp.c.orig	2020-04-15 16:31:21 UTC
2
+++ src/unix/udp.c
3
@@ -214,11 +214,14 @@ static int uv__udp_recvmmsg(uv_udp_t* handle, uv_buf_t
4
     else
5
       handle->recv_cb(handle, UV__ERR(errno), buf, NULL, 0);
6
   } else {
7
-    /* pass each chunk to the application */
8
-    for (k = 0; k < (size_t) nread && handle->recv_cb != NULL; k++) {
9
-      flags = UV_UDP_MMSG_CHUNK;
10
+    /* count to zero, so the buffer base comes last */
11
+    for (k = nread; k > 0 && handle->recv_cb != NULL;) {
12
+      k--;
13
+      flags = 0;
14
       if (msgs[k].msg_hdr.msg_flags & MSG_TRUNC)
15
         flags |= UV_UDP_PARTIAL;
16
+      if (k != 0)
17
+        flags |= UV_UDP_MMSG_CHUNK;
18
 
19
       chunk_buf = uv_buf_init(iov[k].iov_base, iov[k].iov_len);
20
       handle->recv_cb(handle,
21
@@ -227,10 +230,6 @@ static int uv__udp_recvmmsg(uv_udp_t* handle, uv_buf_t
22
                       msgs[k].msg_hdr.msg_name,
23
                       flags);
24
     }
25
-
26
-    /* one last callback so the original buffer is freed */
27
-    if (handle->recv_cb != NULL)
28
-      handle->recv_cb(handle, 0, buf, NULL, 0);
29
   }
30
   return nread;
31
 }

Return to bug 245653