about summary refs log tree commit diff
diff options
context:
space:
mode:
authorUlrich Drepper <drepper@redhat.com>2007-09-23 20:34:25 +0000
committerUlrich Drepper <drepper@redhat.com>2007-09-23 20:34:25 +0000
commit91633816430e7ec5a19fe3ff510a7c4822a9557e (patch)
treec8ccac4a1655a4c822f3aea748be24ffd2270c2e
parent9cc198f65ba914867c8146ab23e0c6adac22a1fb (diff)
downloadglibc-91633816430e7ec5a19fe3ff510a7c4822a9557e.tar.gz
glibc-91633816430e7ec5a19fe3ff510a7c4822a9557e.tar.xz
glibc-91633816430e7ec5a19fe3ff510a7c4822a9557e.zip
* resolv/ns_print.c (ns_sprintrrf): Handle ns_t_a6 and ns_t_opt.
	Provide better error message in case the type is unknown.
-rw-r--r--ChangeLog3
-rw-r--r--resolv/ns_print.c49
2 files changed, 48 insertions, 4 deletions
diff --git a/ChangeLog b/ChangeLog
index df4c9c33c6..4c7aa2202b 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,8 @@
 2007-09-23  Ulrich Drepper  <drepper@redhat.com>
 
+	* resolv/ns_print.c (ns_sprintrrf): Handle ns_t_a6 and ns_t_opt.
+	Provide better error message in case the type is unknown.
+
 	[BZ #4963]
 	* wcsmbs/wcsnlen.c: Don't reference before checking the length.
 	* string/stratcliff.c: Make usable to test wide char functions.
diff --git a/resolv/ns_print.c b/resolv/ns_print.c
index 12b2e67ea6..b0b7a1046e 100644
--- a/resolv/ns_print.c
+++ b/resolv/ns_print.c
@@ -112,6 +112,7 @@ ns_sprintrrf(const u_char *msg, size_t msglen,
 
 	const char *comment;
 	char tmp[100];
+	char errbuf[40];
 	int len, x;
 
 	/*
@@ -174,11 +175,11 @@ ns_sprintrrf(const u_char *msg, size_t msglen,
 		rdata += len;
 		T(addstr(" ", 1, &buf, &buflen));
 
-		    
+
 		/* Second word, optional in ISDN records. */
 		if (type == ns_t_isdn && rdata == edata)
 			break;
-		    
+
 		T(len = charstr(rdata, edata, &buf, &buflen));
 		if (len == 0)
 			goto formerr;
@@ -596,7 +597,7 @@ ns_sprintrrf(const u_char *msg, size_t msglen,
 			}
 			else
 				leader = " ";
-	
+
 			for (n = 0; n < len; n += 48) {
 				T(addstr(leader, strlen(leader),
 					 &buf, &buflen));
@@ -625,8 +626,48 @@ ns_sprintrrf(const u_char *msg, size_t msglen,
 		break;
 	    }
 
+	case ns_t_a6: {
+		struct in6_addr a;
+		int pbyte, pbit;
+
+		/* prefix length */
+		if (rdlen == 0U) goto formerr;
+		len = SPRINTF((tmp, "%d ", *rdata));
+		T(addstr(tmp, len, &buf, &buflen));
+		pbit = *rdata;
+		if (pbit > 128) goto formerr;
+		pbyte = (pbit & ~7) / 8;
+		rdata++;
+
+		/* address suffix: provided only when prefix len != 128 */
+		if (pbit < 128) {
+			if (rdata + pbyte >= edata) goto formerr;
+			memset(&a, 0, sizeof(a));
+			memcpy(&a.s6_addr[pbyte], rdata, sizeof(a) - pbyte);
+			(void) inet_ntop(AF_INET6, &a, buf, buflen);
+			addlen(strlen(buf), &buf, &buflen);
+			rdata += sizeof(a) - pbyte;
+		}
+
+		/* prefix name: provided only when prefix len > 0 */
+		if (pbit == 0)
+			break;
+		if (rdata >= edata) goto formerr;
+		T(addstr(" ", 1, &buf, &buflen));
+		T(addname(msg, msglen, &rdata, origin, &buf, &buflen));
+
+		break;
+	    }
+
+	case ns_t_opt: {
+		len = SPRINTF((tmp, "%u bytes", class));
+		T(addstr(tmp, len, &buf, &buflen));
+		break;
+	    }
+
 	default:
-		comment = "unknown RR type";
+		snprintf (errbuf, sizeof (errbuf), "unknown RR type %d", type);
+		comment = errbuf;
 		goto hexify;
 	}
 	return (buf - obuf);