X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=blobdiff_plain;f=src%2Fparse.c;h=2eb68e4b7c794b9656a8030b7a8636ff78e3e3ea;hb=HEAD;hp=20853dda22abfa73aef53827d5df84200bbe9415;hpb=f9ba6e01db03965cc1a40a693dedcc863b6de4d8;p=adns.git diff --git a/src/parse.c b/src/parse.c index 20853dd..3652b32 100644 --- a/src/parse.c +++ b/src/parse.c @@ -3,15 +3,12 @@ * - parsing assistance functions (mainly for domains inside datagrams) */ /* - * This file is part of adns, which is - * Copyright (C) 1997-2000,2003,2006 Ian Jackson - * Copyright (C) 1999-2000,2003,2006 Tony Finch - * Copyright (C) 1991 Massachusetts Institute of Technology - * (See the file INSTALL for full details.) + * This file is part of adns, which is Copyright Ian Jackson + * and contributors (see the file INSTALL for full details). * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2, or (at your option) + * the Free Software Foundation; either version 3, or (at your option) * any later version. * * This program is distributed in the hope that it will be useful, @@ -20,13 +17,12 @@ * 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; @@ -71,6 +67,7 @@ adns_status adns__findlabel_next(findlabel_state *fls, int *lablen_r, int *labstart_r) { int lablen, jumpto; const char *dgram; + int had_pointer= 0; dgram= fls->dgram; for (;;) { @@ -81,6 +78,7 @@ adns_status adns__findlabel_next(findlabel_state *fls, 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; @@ -107,7 +105,12 @@ adns_status adns__findlabel_next(findlabel_state *fls, 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; } @@ -142,7 +145,7 @@ adns_status adns__parse_domain_more(findlabel_state *fls, adns_state ads, 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];