lib/tsocket: fix loop in tdgram_bsd_recvfrom() (bug #9184)
authorStefan Metzmacher <metze@samba.org>
Tue, 2 Oct 2012 10:20:26 +0000 (12:20 +0200)
committerStefan Metzmacher <metze@samba.org>
Tue, 2 Oct 2012 10:24:11 +0000 (12:24 +0200)
If the socket is not readable yet, we need to retry
if tsocket_bsd_pending() returns 0.

See also
https://lists.samba.org/archive/samba-technical/2012-October/087164.html

metze

lib/tsocket/tsocket_bsd.c

index d5721b4d94ef5d41c81215ec3efb0f120f92d97f..135fd027aa562736aaca2a5601716f0ecf564d77 100644 (file)
@@ -792,7 +792,7 @@ static int tdgram_bsd_set_writeable_handler(struct tdgram_bsd *bsds,
 
 struct tdgram_bsd_recvfrom_state {
        struct tdgram_context *dgram;
-
+       bool first_try;
        uint8_t *buf;
        size_t len;
        struct tsocket_address *src;
@@ -826,6 +826,7 @@ static struct tevent_req *tdgram_bsd_recvfrom_send(TALLOC_CTX *mem_ctx,
        }
 
        state->dgram    = dgram;
+       state->first_try= true;
        state->buf      = NULL;
        state->len      = 0;
        state->src      = NULL;
@@ -876,6 +877,13 @@ static void tdgram_bsd_recvfrom_handler(void *private_data)
        bool retry;
 
        ret = tsocket_bsd_pending(bsds->fd);
+       if (state->first_try && ret == 0) {
+               state->first_try = false;
+               /* retry later */
+               return;
+       }
+       state->first_try = false;
+
        err = tsocket_bsd_error_from_errno(ret, errno, &retry);
        if (retry) {
                /* retry later */