Module Name:src
Committed By: hannken
Date: Tue Nov 20 10:03:39 UTC 2018
Modified Files:
src/external/bsd/nsd/dist: server.c
Log Message:
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.3 -r1.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.3 src/external/bsd/nsd/dist/server.c:1.2
--- src/external/bsd/nsd/dist/server.c:1.1.1.3 Mon Sep 3 11:29:15 2018
+++ src/external/bsd/nsd/dist/server.c Tue Nov 20 10:03:39 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; ipacket);
+ 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