diff options
author | Ryan Fairfax <rfairfax@microsoft.com> | 2019-03-07 13:20:54 -0800 |
---|---|---|
committer | Rich Felker <dalias@aerifal.cx> | 2019-03-13 11:44:12 -0400 |
commit | 2a0ff45b362b7f0f89374ba7240c469d9ea53562 (patch) | |
tree | 3a4fffa419b7ac9b7c2d781e099eeba1f791fcc1 /src | |
parent | 4b125dd408d54487dc8843b9553502aa0c4167f8 (diff) | |
download | musl-2a0ff45b362b7f0f89374ba7240c469d9ea53562.tar.gz musl-2a0ff45b362b7f0f89374ba7240c469d9ea53562.tar.bz2 musl-2a0ff45b362b7f0f89374ba7240c469d9ea53562.tar.xz musl-2a0ff45b362b7f0f89374ba7240c469d9ea53562.zip |
handle labels with 8-bit byte values in dn_skipname
The original logic considered each byte until it either found a 0
value or a value >= 192. This means if a string segment contained any
byte >= 192 it was interepretted as a compressed segment marker even
if it wasn't in a position where it should be interpretted as such.
The fix is to adjust dn_skipname to increment by each segments size
rather than look at each character. This avoids misinterpretting
string segment characters by not considering those bytes.
Diffstat (limited to 'src')
-rw-r--r-- | src/network/dn_skipname.c | 7 |
1 files changed, 5 insertions, 2 deletions
diff --git a/src/network/dn_skipname.c b/src/network/dn_skipname.c index d54c2e5d..eba65bb8 100644 --- a/src/network/dn_skipname.c +++ b/src/network/dn_skipname.c @@ -2,11 +2,14 @@ int dn_skipname(const unsigned char *s, const unsigned char *end) { - const unsigned char *p; - for (p=s; p<end; p++) + const unsigned char *p = s; + while (p < end) if (!*p) return p-s+1; else if (*p>=192) if (p+1<end) return p-s+2; else break; + else + if (end-p<*p+1) break; + else p += *p + 1; return -1; } |