*/
/*
* This file is part of adns, which is
- * Copyright (C) 1997-2000,2003,2006,2014-2016 Ian Jackson
+ * Copyright (C) 1997-2000,2003,2006,2014-2016,2020 Ian Jackson
* Copyright (C) 2014 Mark Wooding
* Copyright (C) 1999-2000,2003,2006 Tony Finch
* Copyright (C) 1991 Massachusetts Institute of Technology
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;
x_badresponse:
adns__diag(fls->ads,fls->serv,fls->qu,
- "label in domain runs beyond end of domain");
+ "label in domain runs or points outside of packet");
+ return adns_s_invalidresponse;
+
+ x_loop:
+ adns__diag(fls->ads,fls->serv,fls->qu,
+ "compressed label pointer chain");
return adns_s_invalidresponse;
}