]> git.ipfire.org Git - thirdparty/ldns.git/commitdiff
allow spaces in DS hex data, see bug 213
authorJelte Jansen <jelte@NLnetLabs.nl>
Wed, 1 Oct 2008 15:47:16 +0000 (15:47 +0000)
committerJelte Jansen <jelte@NLnetLabs.nl>
Wed, 1 Oct 2008 15:47:16 +0000 (15:47 +0000)
had to modify the patch a bit, fixed a possible segfault, and overly enthousiastic data allocation (which resulted in zeroes being added to the hash value)

rr.c
str2host.c

diff --git a/rr.c b/rr.c
index d34ee3ba60ca5b2150d48afefc2dec559cc5aae7..c1831d2aecf2865dff286857da0eb6761a76efac 100644 (file)
--- a/rr.c
+++ b/rr.c
@@ -143,7 +143,7 @@ ldns_rr_new_frm_str_internal(ldns_rr **newrr, const char *str,
        rd_buf = LDNS_MALLOC(ldns_buffer);
        rd = LDNS_XMALLOC(char, LDNS_MAX_RDFLEN);
        b64 = LDNS_XMALLOC(char, LDNS_MAX_RDFLEN);
-       if (!new || !owner || !ttl || !clas || !rdata || !rr_buf || !rd_buf || !rd | !b64) {
+       if (!new || !owner || !ttl || !clas || !rdata || !rr_buf || !rd_buf || !rd || !b64 ) {
                return LDNS_STATUS_MEM_ERR;
        }
        r_cnt = 0;
@@ -348,7 +348,9 @@ ldns_rr_new_frm_str_internal(ldns_rr **newrr, const char *str,
                                quoted = false;
                                /* if type = B64, the field may contain spaces */
                                if (ldns_rr_descriptor_field_type(desc, 
-                                                       r_cnt) == LDNS_RDF_TYPE_B64 ||
+                                           r_cnt) == LDNS_RDF_TYPE_B64 ||
+                                   ldns_rr_descriptor_field_type(desc, 
+                                           r_cnt) == LDNS_RDF_TYPE_HEX ||
                                    ldns_rr_descriptor_field_type(desc, 
                                            r_cnt) == LDNS_RDF_TYPE_LOC ||
                                    ldns_rr_descriptor_field_type(desc, 
@@ -441,6 +443,7 @@ ldns_rr_new_frm_str_internal(ldns_rr **newrr, const char *str,
                                        } else {
                                                /* Normal RR */
                                                switch(ldns_rr_descriptor_field_type(desc, r_cnt)) {
+                                               case LDNS_RDF_TYPE_HEX:
                                                case LDNS_RDF_TYPE_B64:
                                                        /* can have spaces, and will always be the last 
                                                         * record of the rrdata. Read in the rest */
index 034a53e3364e5722ed000cd538f7d25230bd978c..53b21d8e078dcf5fee50b304910b86c55eae4865 100644 (file)
@@ -530,30 +530,33 @@ ldns_str2rdf_hex(ldns_rdf **rd, const char *str)
 
        len = strlen(str);
 
-        if (len % 2 != 0) {
-                return LDNS_STATUS_INVALID_HEX;
-        } else if (len > LDNS_MAX_RDFLEN * 2) {
+       if (len > LDNS_MAX_RDFLEN * 2) {
                return LDNS_STATUS_LABEL_OVERFLOW;
         } else {
-               t = LDNS_XMALLOC(uint8_t, (len / 2));
+               t = LDNS_XMALLOC(uint8_t, (len / 2) + 1);
                t_orig = t;
                 /* Now process octet by octet... */
                 while (*str) {
-                        *t = 0;
-                        for (i = 16; i >= 1; i -= 15) {
-                                if (isxdigit(*str)) {
-                                        *t += ldns_hexdigit_to_int(*str) * i;
-                                } else {
-                                       /* error or be lenient and skip? */
-                                        /*return LDNS_STATUS_ERR;*/
-                                }
-                                ++str;
-                        }
-                        ++t;
+                       *t = 0;
+                       if (isspace(*str)) {
+                               str++;
+                       } else {
+                               for (i = 16; i >= 1; i -= 15) {
+                                       while (*str && isspace(*str)) { str++; }
+                                       if (*str) {
+                                               if (isxdigit(*str)) {
+                                                       *t += ldns_hexdigit_to_int(*str) * i;
+                                               } else {
+                                                       return LDNS_STATUS_ERR;
+                                               }
+                                               ++str;
+                                       }
+                               }
+                               ++t;
+                       }
                 }
-                t = t_orig;
-               *rd = ldns_rdf_new_frm_data(LDNS_RDF_TYPE_HEX, len / 2, t);
-               LDNS_FREE(t);
+               *rd = ldns_rdf_new_frm_data(LDNS_RDF_TYPE_HEX, t - t_orig, t_orig);
+               LDNS_FREE(t_orig);
         }
         return LDNS_STATUS_OK;
 }