diff options
Diffstat (limited to 'contrib/unbound/util/data/dname.c')
-rw-r--r-- | contrib/unbound/util/data/dname.c | 44 |
1 files changed, 29 insertions, 15 deletions
diff --git a/contrib/unbound/util/data/dname.c b/contrib/unbound/util/data/dname.c index f08760e2f9fc..5370aa6f9585 100644 --- a/contrib/unbound/util/data/dname.c +++ b/contrib/unbound/util/data/dname.c @@ -57,7 +57,7 @@ query_dname_len(sldns_buffer* query) if(sldns_buffer_remaining(query) < 1) return 0; /* parse error, need label len */ labellen = sldns_buffer_read_u8(query); - if(labellen&0xc0) + if((labellen&0xc0)) return 0; /* no compression allowed in queries */ len += labellen + 1; if(len > LDNS_MAX_DOMAINLEN) @@ -79,7 +79,7 @@ dname_valid(uint8_t* dname, size_t maxlen) return 0; /* too short, shortest is '0' root label */ labellen = *dname++; while(labellen) { - if(labellen&0xc0) + if((labellen&0xc0)) return 0; /* no compression ptrs allowed */ len += labellen + 1; if(len >= LDNS_MAX_DOMAINLEN) @@ -644,20 +644,22 @@ void dname_str(uint8_t* dname, char* str) if(!dname || !*dname) { *s++ = '.'; *s = 0; - goto out; + return; } lablen = *dname++; while(lablen) { - if(lablen > LDNS_MAX_LABELLEN) { - *s++ = '#'; - *s = 0; - goto out; - } len += lablen+1; if(len >= LDNS_MAX_DOMAINLEN) { + if ((s-str) >= (LDNS_MAX_DOMAINLEN-1)) + s = str + LDNS_MAX_DOMAINLEN - 2; *s++ = '&'; *s = 0; - goto out; + return; + } + if(lablen > LDNS_MAX_LABELLEN) { + *s++ = '#'; + *s = 0; + return; } while(lablen--) { if(isalnum((unsigned char)*dname) @@ -673,10 +675,6 @@ void dname_str(uint8_t* dname, char* str) lablen = *dname++; } *s = 0; - -out: - log_assert(s - str < LDNS_MAX_DOMAINLEN); - return; } int @@ -728,7 +726,7 @@ dname_is_root(uint8_t* dname) return (len == 0); } -void +void dname_remove_label(uint8_t** dname, size_t* len) { size_t lablen; @@ -742,7 +740,23 @@ dname_remove_label(uint8_t** dname, size_t* len) *dname += lablen+1; } -void +int +dname_remove_label_limit_len(uint8_t** dname, size_t* len, size_t lenlimit) +{ + size_t lablen; + log_assert(dname && *dname && len); + lablen = (*dname)[0]; + log_assert(!LABEL_IS_PTR(lablen)); + log_assert(*len > lablen); + if(lablen == 0) + return 0; /* do not modify root label */ + if(*len - (lablen + 1) < lenlimit) return 0; + *len -= lablen+1; + *dname += lablen+1; + return 1; +} + +void dname_remove_labels(uint8_t** dname, size_t* len, int n) { int i; |