about summary refs log tree commit diff
path: root/src/network/dn_expand.c
diff options
context:
space:
mode:
authorRich Felker <dalias@aerifal.cx>2013-08-14 18:18:46 -0400
committerRich Felker <dalias@aerifal.cx>2013-08-14 18:18:46 -0400
commit56b57f37a46dab432247bf29d96fcb11fbd02a6d (patch)
treefe514e3154989d30e95e1f271e5b9615fc242ecd /src/network/dn_expand.c
parentfcc522c92335783293ac19df318415cd97fbf66b (diff)
downloadmusl-56b57f37a46dab432247bf29d96fcb11fbd02a6d.tar.gz
musl-56b57f37a46dab432247bf29d96fcb11fbd02a6d.tar.xz
musl-56b57f37a46dab432247bf29d96fcb11fbd02a6d.zip
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.
Diffstat (limited to 'src/network/dn_expand.c')
-rw-r--r--src/network/dn_expand.c8
1 files changed, 5 insertions, 3 deletions
diff --git a/src/network/dn_expand.c b/src/network/dn_expand.c
index 72a80e82..f817d059 100644
--- a/src/network/dn_expand.c
+++ b/src/network/dn_expand.c
@@ -6,7 +6,7 @@ int __dn_expand(const unsigned char *base, const unsigned char *end, const unsig
 	const unsigned char *p = src;
 	int len = -1, j;
 	if (space > 256) space = 256;
-	if (p==end) return -1;
+	if (p==end || !*p) return -1;
 	for (;;) {
 		if (*p & 0xc0) {
 			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;
 		} else if (*p) {
 			j = *p+1;
-			if (len < 0) len = p+1-src;
 			if (j>=end-p || j>space) return -1;
 			while (--j) *dest++ = *p++;
 			*dest++ = *++p ? '.' : 0;
-		} else return len;
+		} else {
+			if (len < 0) len = p+1-src;
+			return len;
+		}
 	}
 }