1303 files changed, 32187 insertions, 57138 deletions
diff --git a/networking/udhcp/domain_codec.c b/networking/udhcp/domain_codec.c index c1325d8..5a923cc 100644 --- a/networking/udhcp/domain_codec.c +++ b/networking/udhcp/domain_codec.c @@ -7,6 +7,7 @@ * Licensed under GPLv2 or later, see file LICENSE in this source tree. */ #ifdef DNS_COMPR_TESTING +# define _GNU_SOURCE # define FAST_FUNC /* nothing */ # define xmalloc malloc # include <stdlib.h> @@ -42,7 +43,7 @@ char* FAST_FUNC dname_dec(const uint8_t *cstr, int clen, const char *pre) */ while (1) { /* note: "return NULL" below are leak-safe since - * dst isn't yet allocated */ + * dst isn't allocated yet */ const uint8_t *c; unsigned crtpos, retpos, depth, len; @@ -63,11 +64,10 @@ char* FAST_FUNC dname_dec(const uint8_t *cstr, int clen, const char *pre) if (crtpos + *c + 1 > clen) /* label too long? abort */ return NULL; if (dst) - memcpy(dst + len, c + 1, *c); + /* \3com ---> "com." */ + ((char*)mempcpy(dst + len, c + 1, *c))[0] = '.'; len += *c + 1; crtpos += *c + 1; - if (dst) - dst[len - 1] = '.'; } else { /* NUL: end of current domain name */ if (retpos == 0) { @@ -78,7 +78,10 @@ char* FAST_FUNC dname_dec(const uint8_t *cstr, int clen, const char *pre) crtpos = retpos; retpos = depth = 0; } - if (dst) + if (dst && len != 0) + /* \4host\3com\0\4host and we are at \0: + * \3com was converted to "com.", change dot to space. + */ dst[len - 1] = ' '; } @@ -95,9 +98,8 @@ char* FAST_FUNC dname_dec(const uint8_t *cstr, int clen, const char *pre) if (!dst) { /* first pass? */ /* allocate dst buffer and copy pre */ unsigned plen = strlen(pre); - ret = dst = xmalloc(plen + len); - memcpy(dst, pre, plen); - dst += plen; + ret = xmalloc(plen + len); + dst = stpcpy(ret, pre); } else { dst[len - 1] = '\0'; break; @@ -228,6 +230,9 @@ int main(int argc, char **argv) int len; uint8_t *encoded; + uint8_t str[6] = { 0x00, 0x00, 0x02, 0x65, 0x65, 0x00 }; + printf("NUL:'%s'\n", dname_dec(str, 6, "")); + #define DNAME_DEC(encoded,pre) dname_dec((uint8_t*)(encoded), sizeof(encoded), (pre)) printf("'%s'\n", DNAME_DEC("\4host\3com\0", "test1:")); printf("test2:'%s'\n", DNAME_DEC("\4host\3com\0\4host\3com\0", "")); |