Module Name: src Committed By: martin Date: Tue Nov 20 16:02:50 UTC 2018
Modified Files: src/external/bsd/nsd/dist [netbsd-8]: server.c Log Message: Pull up following revision(s) (requested by hannken in ticket #1098): external/bsd/nsd/dist/server.c: revision 1.2 Fix NSD when built with --enable-recvmmsg: When resetting a query with query_reset(queries[i], ...) always restore the corresponding msgs[i].msg_hdr.msg_namelen from queries[i]->addrlen. After receiving a message set queries[i]->addrlen to the received msg_namelen. Reported upstream, will be fixed for 4.1.26 To generate a diff of this commit: cvs rdiff -u -r1.1.1.1.8.1 -r1.1.1.1.8.2 src/external/bsd/nsd/dist/server.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/external/bsd/nsd/dist/server.c diff -u src/external/bsd/nsd/dist/server.c:1.1.1.1.8.1 src/external/bsd/nsd/dist/server.c:1.1.1.1.8.2 --- src/external/bsd/nsd/dist/server.c:1.1.1.1.8.1 Sat Oct 13 17:30:00 2018 +++ src/external/bsd/nsd/dist/server.c Tue Nov 20 16:02:50 2018 @@ -2209,6 +2209,7 @@ handle_udp(int fd, short event, void* ar for (i = 0; i < recvcount; i++) { loopstart: received = msgs[i].msg_len; + queries[i]->addrlen = msgs[i].msg_hdr.msg_namelen; q = queries[i]; if (received == -1) { log_msg(LOG_ERR, "recvmmsg %d failed %s", i, strerror( @@ -2217,6 +2218,7 @@ handle_udp(int fd, short event, void* ar /* No zone statup */ query_reset(queries[i], UDP_MAX_MESSAGE_LEN, 0); iovecs[i].iov_len = buffer_remaining(q->packet); + msgs[i].msg_hdr.msg_namelen = queries[i]->addrlen; goto swap_drop; } @@ -2264,6 +2266,7 @@ handle_udp(int fd, short event, void* ar } else { query_reset(queries[i], UDP_MAX_MESSAGE_LEN, 0); iovecs[i].iov_len = buffer_remaining(q->packet); + msgs[i].msg_hdr.msg_namelen = queries[i]->addrlen; swap_drop: STATUP(data->nsd, dropped); ZTATUP(data->nsd, q->zone, dropped); @@ -2304,6 +2307,7 @@ handle_udp(int fd, short event, void* ar for(i=0; i<recvcount; i++) { query_reset(queries[i], UDP_MAX_MESSAGE_LEN, 0); iovecs[i].iov_len = buffer_remaining(queries[i]->packet); + msgs[i].msg_hdr.msg_namelen = queries[i]->addrlen; } } @@ -2344,13 +2348,15 @@ handle_udp(int fd, short event, void* ar } for (i = 0; i < recvcount; i++) { received = msgs[i].msg_len; - msgs[i].msg_hdr.msg_namelen = queries[i]->addrlen; + queries[i]->addrlen = msgs[i].msg_hdr.msg_namelen; if (received == -1) { log_msg(LOG_ERR, "recvmmsg failed"); STATUP(data->nsd, rxerr); /* No zone statup */ /* the error can be found in msgs[i].msg_hdr.msg_flags */ query_reset(queries[i], UDP_MAX_MESSAGE_LEN, 0); + iovecs[i].iov_len = buffer_remaining(queries[i]->packet); + msgs[i].msg_hdr.msg_namelen = queries[i]->addrlen; continue; } q = queries[i]; @@ -2442,6 +2448,8 @@ handle_udp(int fd, short event, void* ar #ifndef NONBLOCKING_IS_BROKEN #ifdef HAVE_RECVMMSG query_reset(queries[i], UDP_MAX_MESSAGE_LEN, 0); + iovecs[i].iov_len = buffer_remaining(queries[i]->packet); + msgs[i].msg_hdr.msg_namelen = queries[i]->addrlen; #endif } #endif