*/
/*
* This file is part of adns, which is
- * Copyright (C) 1997-2000,2003,2006 Ian Jackson
+ * Copyright (C) 1997-2000,2003,2006,2014-2016 Ian Jackson
+ * Copyright (C) 2014 Mark Wooding
* Copyright (C) 1999-2000,2003,2006 Tony Finch
* Copyright (C) 1991 Massachusetts Institute of Technology
* (See the file INSTALL for full details.)
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ * along with this program; if not, write to the Free Software Foundation.
*/
#include "internal.h"
-int vbuf__append_quoted1035(vbuf *vb, const byte *buf, int len) {
+static int vbuf_append_quoted1035(vbuf *vb, const byte *buf, int len) {
char qbuf[10];
int i, ch;
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;
}
if (!adns__vbuf_append(vb,".",1)) return adns_s_nomemory;
}
if (flags & pdf_quoteok) {
- if (!vbuf__append_quoted1035(vb,dgram+labstart,lablen))
+ if (!vbuf_append_quoted1035(vb,dgram+labstart,lablen))
return adns_s_nomemory;
} else {
ch= dgram[labstart];