fix length computation in dn_expand

there are two possible points where the length is evaluated: either
the first 'compression' jump, or the null terminator if no jumps have
taken place yet. the previous code only measured the length of the
first component.
This commit is contained in:
Rich Felker
2013-08-14 18:18:46 -04:00
parent fcc522c923
commit 56b57f37a4

View File

@ -6,7 +6,7 @@ int __dn_expand(const unsigned char *base, const unsigned char *end, const unsig
const unsigned char *p = src; const unsigned char *p = src;
int len = -1, j; int len = -1, j;
if (space > 256) space = 256; if (space > 256) space = 256;
if (p==end) return -1; if (p==end || !*p) return -1;
for (;;) { for (;;) {
if (*p & 0xc0) { if (*p & 0xc0) {
if (p+1==end) return -1; if (p+1==end) return -1;
@ -16,11 +16,13 @@ int __dn_expand(const unsigned char *base, const unsigned char *end, const unsig
p = base+j; p = base+j;
} else if (*p) { } else if (*p) {
j = *p+1; j = *p+1;
if (len < 0) len = p+1-src;
if (j>=end-p || j>space) return -1; if (j>=end-p || j>space) return -1;
while (--j) *dest++ = *p++; while (--j) *dest++ = *p++;
*dest++ = *++p ? '.' : 0; *dest++ = *++p ? '.' : 0;
} else return len; } else {
if (len < 0) len = p+1-src;
return len;
}
} }
} }