* resolv/ns_print.c (ns_sprintrrf): Handle ns_t_a6 and ns_t_opt.
authorUlrich Drepper <drepper@redhat.com>
Sun, 23 Sep 2007 20:34:25 +0000 (20:34 +0000)
committerUlrich Drepper <drepper@redhat.com>
Sun, 23 Sep 2007 20:34:25 +0000 (20:34 +0000)
Provide better error message in case the type is unknown.

ChangeLog
resolv/ns_print.c

index df4c9c3..4c7aa22 100644 (file)
--- 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.
index 12b2e67..b0b7a10 100644 (file)
@@ -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);