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) {