Package: radvd
Version: 1:1.7-1
Severity: minor
Tags: patch

The DNSSL parser uses uninitialized memory when examining the first
suffix:

Feb 27 02:28:51 tesla radvd[19705]: DNSSL suffix ะน#003#037#016#177.vault24.org 
received on br0 from fe80::221:85ff:fe1f:20f0 is not advertised by us

Attached is a patch that fixes this, it also changes the text of the
following log message to be more correct:

Feb 27 02:38:38 tesla radvd[19715]: Exiting, privsep_read_loop had readn error: 
Success


Minor cause DNSSL isn't supported by much, so no one is likely to be
using it yet.

-- System Information:
Debian Release: wheezy/sid
  APT prefers unstable
  APT policy: (500, 'unstable')
Architecture: amd64 (x86_64)

Kernel: Linux 2.6.32-5-amd64 (SMP w/2 CPU cores)
Locale: LANG=en_US.UTF-8, LC_CTYPE=en_US.UTF-8 (charmap=UTF-8)
Shell: /bin/sh linked to /bin/dash

Versions of packages radvd depends on:
ii  adduser                       3.112+nmu2 add and remove users and groups
ii  libc6                         2.11.2-11  Embedded GNU C Library: Shared lib

radvd recommends no packages.

radvd suggests no packages.

-- no debconf information
--- radvd-1.7.orig/radvdump.c
+++ radvd-1.7/radvdump.c
@@ -436,6 +436,7 @@
 			dnssl_info = (struct nd_opt_dnssl_info_local *) opt_str;
 
 			printf("\n\tDNSSL");
+			suffix[0] = '\0';
 
 			for (offset = 0;offset < (dnssl_info->nd_opt_dnssli_len-1)*8;) {
 				label_len = dnssl_info->nd_opt_dnssli_suffixes[offset++];
--- radvd-1.7.orig/process.c
+++ radvd-1.7/process.c
@@ -414,6 +414,7 @@
 			break;
 		case ND_OPT_DNSSL_INFORMATION:
 			dnsslinfo = (struct nd_opt_dnssl_info_local *) opt_str;
+			suffix[0] = '\0';
 			for (offset = 0; offset < (dnsslinfo->nd_opt_dnssli_len-1)*8;) {
 				label_len = dnsslinfo->nd_opt_dnssli_suffixes[offset++];
 
--- radvd-1.7.orig/privsep-linux.c
+++ radvd-1.7/privsep-linux.c
@@ -52,9 +52,13 @@
 		ret = readn(pfd, &cmd, sizeof(cmd));
 		if (ret <= 0) {
 			/* Error or EOF, give up */
+			if (ret < 0) {
+				flog(LOG_ERR, "Exiting, privsep_read_loop had readn error: %s\n",
+				     strerror(errno));
+			} else {
+				flog(LOG_ERR, "Exiting, privsep_read_loop had readn return 0 bytes\n");
+			}
 			close(pfd);
-			flog(LOG_ERR, "Exiting, privsep_read_loop had readn error: %s\n",
-			     strerror(errno));
 			_exit(0);
 		}
 		if (ret != sizeof(cmd)) {

Reply via email to