diff options
author | edwin <edwin@FreeBSD.org> | 2004-01-03 13:42:42 +0800 |
---|---|---|
committer | edwin <edwin@FreeBSD.org> | 2004-01-03 13:42:42 +0800 |
commit | 6f121885901703c3717b58a58af68169d92bd977 (patch) | |
tree | 934eabc5e6209a814c515f894aca02739cb567db /dns/dnrd | |
parent | 184e2ebec9f623c223296a19518cf6bda5be4a44 (diff) | |
download | freebsd-ports-gnome-6f121885901703c3717b58a58af68169d92bd977.tar.gz freebsd-ports-gnome-6f121885901703c3717b58a58af68169d92bd977.tar.zst freebsd-ports-gnome-6f121885901703c3717b58a58af68169d92bd977.zip |
dns/dnrd: recv_addr init wrong and 512 byte udp packets dropped
There are a few bugs in dnrd that should probably be fixed
by the author but could be made to work on bsd:
1. Initialization in common.h of recv_addr is broken,
causing at least the '-a' switch not to work. Instead of
assuming positions of fields in the struct across platforms
I thought it safer to do a standard initialization in main().
2. The buffer overflow code in udp.c:dnsrecv() is off by
one, rejecting messages where the size exactly fills the
available buffer. I also changed to the calls to dnsrecv
to pass 512 as the max size instead of the buffers that
seem to be padded by 4 bytes for a reason I don't understand.
This causes a calling named to resend packets. Eventually
one seems to get through but response times can be painfully
slow.
PR: ports/41128
Submitted by: Michael C. Adler <mad1@tapil.com>
Diffstat (limited to 'dns/dnrd')
-rw-r--r-- | dns/dnrd/Makefile | 11 | ||||
-rw-r--r-- | dns/dnrd/files/patch-main.c | 19 | ||||
-rw-r--r-- | dns/dnrd/files/patch-udp.c | 29 |
3 files changed, 51 insertions, 8 deletions
diff --git a/dns/dnrd/Makefile b/dns/dnrd/Makefile index fae1faf62c38..2080ced9f402 100644 --- a/dns/dnrd/Makefile +++ b/dns/dnrd/Makefile @@ -7,6 +7,7 @@ PORTNAME= dnrd PORTVERSION= 2.10 +PORTREVISION= 1 CATEGORIES= dns MASTER_SITES= http://users.zoominternet.net/~garsh/dnrd/archive/ \ http://www.netsw.org/net/ip/infoservice/dns/dnrd/ @@ -17,15 +18,17 @@ COMMENT= A proxy DNS daemon WRKSRC= ${WRKDIR}/${DISTNAME}/src USE_GMAKE= yes -USE_REINPLACE= yes +USE_REINPLACE= yes MAN8= dnrd.8 post-patch: .for F in main.c master.c - @(cd ${WRKSRC} && ${SED} -e 's,%%PREFIX%%,${PREFIX},g' $F > foo && \ - ${MV} foo $F) + ${REINPLACE_CMD} -e 's,%%PREFIX%%,${PREFIX},g' ${WRKSRC}/$F .endfor - ${REINPLACE_CMD} -e "s@cc@${CC}@g; s@-lc_r@${PTHREAD_LIBS}@g" ${WRKSRC}/Makefile + ${REINPLACE_CMD} \ + -e "s,cc,${CC},g" \ + -e "s,-lc_r,${PTHREAD_LIBS},g" \ + ${WRKSRC}/Makefile .include <bsd.port.mk> diff --git a/dns/dnrd/files/patch-main.c b/dns/dnrd/files/patch-main.c index 09f5612abf43..e5a2f673f3e5 100644 --- a/dns/dnrd/files/patch-main.c +++ b/dns/dnrd/files/patch-main.c @@ -1,5 +1,5 @@ ---- main.c.orig Thu Jan 4 14:40:42 2001 -+++ main.c Sat Jan 6 15:06:31 2001 +--- main.c.orig Fri Jan 5 01:40:42 2001 ++++ main.c Sat Jan 3 16:39:25 2004 @@ -18,6 +18,7 @@ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ @@ -16,7 +16,18 @@ #include <sys/stat.h> #include <sys/socket.h> #include <sys/stat.h> -@@ -170,20 +170,20 @@ +@@ -82,6 +82,10 @@ + /* + * Parse the command line. + */ ++ memset(&recv_addr, 0, sizeof(recv_addr)); ++ recv_addr.sin_family = AF_INET; ++ recv_addr.sin_port = htons(53); ++ + parse_args(argc, argv); + + openlog(progname, LOG_PID, LOG_DAEMON); +@@ -170,20 +174,20 @@ * Change our root and current working directories to /etc/dnrd. * Also, so some sanity checking on that directory first. */ @@ -42,7 +53,7 @@ cleanexit(-1); } -@@ -198,31 +198,31 @@ +@@ -198,31 +202,31 @@ if (rslt) continue; if (S_ISDIR(st.st_mode)) { diff --git a/dns/dnrd/files/patch-udp.c b/dns/dnrd/files/patch-udp.c new file mode 100644 index 000000000000..df1a41db4f30 --- /dev/null +++ b/dns/dnrd/files/patch-udp.c @@ -0,0 +1,29 @@ +--- udp.c.orig Sat Jan 3 16:39:53 2004 ++++ udp.c Sat Jan 3 16:40:36 2004 +@@ -74,7 +74,7 @@ + + /* Read in the message */ + addr_len = sizeof(struct sockaddr_in); +- len = recvfrom(isock, msg, sizeof(msg), 0, ++ len = recvfrom(isock, msg, maxsize, 0, + (struct sockaddr *)&from_addr, &addr_len); + if (len < 0) { + log_debug("recvfrom error %s", strerror(errno)); +@@ -172,7 +172,7 @@ + inet_ntoa(dns_srv[k].addr.sin_addr)); + return (-1); + } +- else if (rc == len) { ++ else if (rc > len) { + log_msg(LOG_NOTICE, "packet too large: %s", + inet_ntoa(dns_srv[k].addr.sin_addr)); + return (0); +@@ -202,7 +202,7 @@ + struct sockaddr_in from_addr; + unsigned addr_len; + +- len = dnsrecv(srvidx, msg, sizeof(msg)); ++ len = dnsrecv(srvidx, msg, maxsize); + if (opt_debug) { + char buf[80]; + sprintf_cname(&msg[12], buf, 80); |