diff --git a/src/resolve.c b/src/resolve.c index 5b9da88..c7991e6 100644 --- a/src/resolve.c +++ b/src/resolve.c @@ -167,6 +167,7 @@ uint32_t udpresolve(int af, unsigned char * name, unsigned char * value, uint32_ k += 4; if(na > 255) na = 255; /* somebody is very evil */ for (j = 0; j < na; j++) { /* now there should be answers */ + if(k >= len) break; while(buf[k] < 192 && buf[k] !=0 && (k+buf[k]+14) < len) k+= (buf[k] + 1); if(!buf[k]) k--; if((k+(af == AF_INET6?28:16)) > len) { @@ -195,15 +196,17 @@ uint32_t udpresolve(int af, unsigned char * name, unsigned char * value, uint32_ k+= (12 + flen); continue; /* we need A PTR */ } - for (s2 = buf + k + 12; s2 < (buf + k + 12 + len) && *s2; ){ - s1 = s2 + ((unsigned)*s2) + 1; + s1 = buf + k + 12 + flen; /* the end of this record's data, inside the answer */ + for (s2 = buf + k + 12; s2 < s1 && *s2 && *s2 < 64; ){ + unsigned char *next = s2 + ((unsigned)*s2) + 1; *s2 = '.'; - s2 = s1; + s2 = next; } - *s2 = 0; + if(s2 >= s1 || *s2 || s2 == buf + k + 12) + break; /* the name runs past its data, is compressed or empty */ if(param->username)free(param->username); param->username = (unsigned char *)strdup ((char *)buf + k + 13); - + return udpresolve(af,param->username, value, NULL, NULL, 2); } }