]> git.ipfire.org Git - people/ms/dnsmasq.git/commitdiff
Tweaks to previous, DNS label charset commit.
authorSimon Kelley <simon@thekelleys.org.uk>
Wed, 22 Apr 2015 20:14:31 +0000 (21:14 +0100)
committerSimon Kelley <simon@thekelleys.org.uk>
Wed, 22 Apr 2015 20:14:31 +0000 (21:14 +0100)
src/dns-protocol.h
src/dnssec.c
src/rfc1035.c
src/util.c

index 7f5d686bb1503fdf93405165005a5c6bf6c86fb4..4b71746f8d2608c888e36d746e8caa8b23cb8267 100644 (file)
@@ -144,5 +144,9 @@ struct dns_header {
   (!CHECK_LEN(header, pp, plen, len) ? 0 : (((pp) += (len)), 1))
 
 /* Escape character in our presentation format for names.
-   Cannot be '.' or /000 and must be !isprint() */
+   Cannot be '.' or /000 and must be !isprint().
+   Note that escaped chars are stored as
+   <NAME_ESCAPE> <orig-char+1>
+   to ensure that the escaped form of /000 doesn't include /000
+*/
 #define NAME_ESCAPE 1
index c116a7b5f6f45a7699abfaf82eef7f8c986eed85..a9e12153ccf2e48b298d69c5a05449870ce69198 100644 (file)
@@ -341,9 +341,11 @@ static int to_wire(char *name)
        if (*p >= 'A' && *p <= 'Z')
          *p = *p - 'A' + 'a';
        else if (*p == NAME_ESCAPE)
-         for (q = p; *q; q++)
+         {
+           for (q = p; *q; q++)
              *q = *(q+1);
-              
+           (*p)--;
+         }
       term = *p;
       
       if ((len = p - l) != 0)
@@ -376,7 +378,8 @@ static void from_wire(char *name)
          {
            memmove(p+1, p, 1 + last - p);
            len++;
-           *p++ = NAME_ESCAPE;
+           *p++ = NAME_ESCAPE; 
+           (*p)++;
          }
        
       l[len] = '.';
index 19fecc818c06211422982e9ce62aff414d5fcdb4..32df31ad603ce1ef94592b00d30f3591d8acb970 100644 (file)
@@ -20,7 +20,7 @@ int extract_name(struct dns_header *header, size_t plen, unsigned char **pp,
                 char *name, int isExtract, int extrabytes)
 {
   unsigned char *cp = (unsigned char *)name, *p = *pp, *p1 = NULL;
-  unsigned int j, l, hops = 0;
+  unsigned int j, l, namelen = 0, hops = 0;
   int retvalue = 1;
   
   if (isExtract)
@@ -94,9 +94,15 @@ int extract_name(struct dns_header *header, size_t plen, unsigned char **pp,
            count = 256;
          digs = ((count-1)>>2)+1;
          
-         /* output is \[x<hex>/siz]. which is digs+9 chars */
-         if (cp - (unsigned char *)name + digs + 9 >= MAXDNAME)
+         /* output is \[x<hex>/siz]. which is digs+6/7/8 chars */
+         namelen += digs+6;
+         if (count > 9)
+           namelen++;
+         if (count > 99)
+           namelen++;
+         if (namelen+1 >= MAXDNAME)
            return 0;
+
          if (!CHECK_LEN(header, p, plen, (count-1)>>3))
            return 0;
 
@@ -119,7 +125,8 @@ int extract_name(struct dns_header *header, size_t plen, unsigned char **pp,
        }
       else 
        { /* label_type = 0 -> label. */
-         if (cp - (unsigned char *)name + l + 1 >= MAXDNAME)
+         namelen += l;
+         if (namelen+1 >= MAXDNAME)
            return 0;
          if (!CHECK_LEN(header, p, plen, l))
            return 0;
@@ -132,8 +139,12 @@ int extract_name(struct dns_header *header, size_t plen, unsigned char **pp,
                if (option_bool(OPT_DNSSEC_VALID))
                  {
                    if (c == 0 || c == '.' || c == NAME_ESCAPE)
-                     *cp++ = NAME_ESCAPE;
-                   *cp++ = c;
+                     {
+                       *cp++ = NAME_ESCAPE;
+                       *cp++ = c+1;
+                     }
+                   else
+                     *cp++ = c; 
                  }
                else
 #endif
@@ -155,7 +166,7 @@ int extract_name(struct dns_header *header, size_t plen, unsigned char **pp,
                      c1 += 'a' - 'A';
 #ifdef HAVE_DNSSEC
                    if (option_bool(OPT_DNSSEC_VALID) && c1 == NAME_ESCAPE)
-                     c1 = *cp++;
+                     c1 = (*cp++)-1;
 #endif
                    
                    if (c2 >= 'A' && c2 <= 'Z')
index 0c1a48b4700ae0288724752b1df6b96e5589905c..9299703c6d30aac851980b245dc95a8394323598 100644 (file)
@@ -229,7 +229,7 @@ unsigned char *do_rfc1035_name(unsigned char *p, char *sval)
        {
 #ifdef HAVE_DNSSEC
          if (option_bool(OPT_DNSSEC_VALID) && *sval == NAME_ESCAPE)
-           *p++ = *(++sval);
+           *p++ = (*(++sval))-1;
          else
 #endif         
            *p++ = *sval;