From 3323605fa9a0a2e7392b45297b9acf5e20f11ff0 Mon Sep 17 00:00:00 2001 From: Matthew Flatt Date: Mon, 20 Oct 2014 17:56:27 -0500 Subject: [PATCH] racket/udp: adjust receive into a zero-sized buffer The OS doesn't necessarily react to a zero-sized buffer the way that `udp-receive!` is supposed to work, so provide only a non-zero-sized buffer to the OS. --- pkgs/racket-pkgs/racket-test/tests/racket/udp.rktl | 1 + racket/src/racket/src/network.c | 14 ++++++++++++-- 2 files changed, 13 insertions(+), 2 deletions(-) diff --git a/pkgs/racket-pkgs/racket-test/tests/racket/udp.rktl b/pkgs/racket-pkgs/racket-test/tests/racket/udp.rktl index c545b83a5e..c4061d2540 100644 --- a/pkgs/racket-pkgs/racket-test/tests/racket/udp.rktl +++ b/pkgs/racket-pkgs/racket-test/tests/racket/udp.rktl @@ -163,6 +163,7 @@ (sync (udp-receive!-evt udp2 us1))) (test #f sync/timeout 0.05 udp2-r) (test #f sync/timeout 0.05 (udp-receive!-evt udp2 us1)) +(test #f sync/timeout 0.05 (udp-receive!-evt udp2 (make-bytes 0))) ;; break behavior (let ([t (parameterize-break #f diff --git a/racket/src/racket/src/network.c b/racket/src/racket/src/network.c index 42116e02cf..0a043a291c 100644 --- a/racket/src/racket/src/network.c +++ b/racket/src/racket/src/network.c @@ -3682,8 +3682,18 @@ static int do_udp_recv(const char *name, Scheme_UDP *udp, char *bstr, intptr_t s } { - x = recvfrom(udp->s, bstr XFORM_OK_PLUS start, end - start, 0, - (struct sockaddr *)src_addr, &asize); + if (end == start) { + /* recvfrom() doesn't necessarily wait if you pass a buffer size of 0; + to be consistent with accepting a message but discarding bytes that + don't fit, accept at least one byte and turn a `1` result into `0` */ + char buf[1]; + x = recvfrom(udp->s, buf, 1, 0, (struct sockaddr *)src_addr, &asize); + if (x == 1) + x = 0; + } else { + x = recvfrom(udp->s, bstr XFORM_OK_PLUS start, end - start, 0, + (struct sockaddr *)src_addr, &asize); + } } if (x == -1) {