int *lablen_r, int *labstart_r) {
int lablen, jumpto;
const char *dgram;
+ int had_pointer= 0;
dgram= fls->dgram;
for (;;) {
if ((lablen & 0x0c0) != 0x0c0) return adns_s_unknownformat;
if (fls->cbyte >= fls->dglen) goto x_truncated;
if (fls->cbyte >= fls->max) goto x_badresponse;
+ if (had_pointer++ >= 2) goto x_loop;
GET_B(fls->cbyte,jumpto);
jumpto |= (lablen&0x3f)<<8;
if (fls->dmend_r) *(fls->dmend_r)= fls->cbyte;
adns__diag(fls->ads,fls->serv,fls->qu,
"label in domain runs beyond end of domain");
return adns_s_invalidresponse;
+
+ x_loop:
+ adns__diag(fls->ads,fls->serv,fls->qu,
+ "compressed label pointer chain");
+ return adns_s_invalidresponse;
}
adns_status adns__parse_domain(adns_state ads, int serv, adns_query qu,