diff options
author | Nick Mathewson <nickm@torproject.org> | 2010-01-25 14:09:58 -0500 |
---|---|---|
committer | Nick Mathewson <nickm@torproject.org> | 2010-01-25 14:09:58 -0500 |
commit | 2590d733f4f3c6968bcdcb9880875ea90295ea80 (patch) | |
tree | 3c779d0591cc6d3cd04f34d555b2d0c907e1bfa1 | |
parent | ab87b61a9d1e18d85229c9fbf6c3862cea6a7bdd (diff) | |
download | tor-2590d733f4f3c6968bcdcb9880875ea90295ea80.tar tor-2590d733f4f3c6968bcdcb9880875ea90295ea80.tar.gz |
Try to untangle the logic in server_port_flush
It's a bit confusing to have a loop where another function,
confusingly named "*_free", is responsible for advancing the loop
variable (or rather, for altering a structure so that the next time
the loop variable's initializer is evaluated it evaluates to something
different.)
Not only has this confused people: it's also confused coverity scan.
Let's fix that.
-rw-r--r-- | src/or/eventdns.c | 7 |
1 files changed, 5 insertions, 2 deletions
diff --git a/src/or/eventdns.c b/src/or/eventdns.c index a504224c5..06add11b1 100644 --- a/src/or/eventdns.c +++ b/src/or/eventdns.c @@ -1293,8 +1293,8 @@ server_port_read(struct evdns_server_port *s) { static void server_port_flush(struct evdns_server_port *port) { - while (port->pending_replies) { - struct server_request *req = port->pending_replies; + struct server_request *req = port->pending_replies; + while (req) { ssize_t r = sendto(port->socket, req->response, req->response_len, 0, (struct sockaddr*) &req->addr, (socklen_t)req->addrlen); if (r < 0) { @@ -1306,6 +1306,9 @@ server_port_flush(struct evdns_server_port *port) if (server_request_free(req)) { /* we released the last reference to req->port. */ return; + } else { + assert(port->pending_replies != req); + req = port->pending_replies; } } |