Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files. =================================================================== RCS file: /ftp/cvs/cvsroot/src/lib/libc/nameser/ns_parse.c,v retrieving revision 1.6 retrieving revision 1.6.14.1 diff -u -p -r1.6 -r1.6.14.1 --- src/lib/libc/nameser/ns_parse.c 2008/06/21 20:41:48 1.6 +++ src/lib/libc/nameser/ns_parse.c 2011/01/09 20:43:28 1.6.14.1 @@ -1,4 +1,4 @@ -/* $NetBSD: ns_parse.c,v 1.6 2008/06/21 20:41:48 christos Exp $ */ +/* $NetBSD: ns_parse.c,v 1.6.14.1 2011/01/09 20:43:28 riz Exp $ */ /* * Copyright (c) 2004 by Internet Systems Consortium, Inc. ("ISC") @@ -20,9 +20,9 @@ #include #ifndef lint #ifdef notdef -static const char rcsid[] = "Id: ns_parse.c,v 1.9 2007/08/27 03:32:26 marka Exp"; +static const char rcsid[] = "Id: ns_parse.c,v 1.10 2009/01/23 19:59:16 each Exp"; #else -__RCSID("$NetBSD: ns_parse.c,v 1.6 2008/06/21 20:41:48 christos Exp $"); +__RCSID("$NetBSD: ns_parse.c,v 1.6.14.1 2011/01/09 20:43:28 riz Exp $"); #endif #endif @@ -54,6 +54,9 @@ static void setsection(ns_msg *msg, ns_s do { errno = (err); if (errno == errno) return (-1); } while (0) #endif +#define PARSE_FMT_PRESO 0 /* Parse using presentation-format names */ +#define PARSE_FMT_WIRE 1 /* Parse using network-format names */ + /* Public. */ /* These need to be in the same order as the nres.h:ns_flag enum. */ @@ -109,7 +112,6 @@ ns_initparse(const u_char *msg, int msgl const u_char *eom = msg + msglen; int i; - memset(handle, 0x5e, sizeof *handle); handle->_msg = msg; handle->_eom = eom; if (msg + NS_INT16SZ > eom) @@ -201,6 +203,69 @@ ns_parserr(ns_msg *handle, ns_sect secti return (0); } +/* + * This is identical to the above but uses network-format (uncompressed) names. + */ +int +ns_parserr2(ns_msg *handle, ns_sect section, int rrnum, ns_rr2 *rr) { + int b; + int tmp; + + /* Make section right. */ + tmp = section; + if (tmp < 0 || section >= ns_s_max) + RETERR(ENODEV); + if (section != handle->_sect) + setsection(handle, section); + + /* Make rrnum right. */ + if (rrnum == -1) + rrnum = handle->_rrnum; + if (rrnum < 0 || rrnum >= handle->_counts[(int)section]) + RETERR(ENODEV); + if (rrnum < handle->_rrnum) + setsection(handle, section); + if (rrnum > handle->_rrnum) { + b = ns_skiprr(handle->_msg_ptr, handle->_eom, section, + rrnum - handle->_rrnum); + + if (b < 0) + return (-1); + handle->_msg_ptr += b; + handle->_rrnum = rrnum; + } + + /* Do the parse. */ + b = ns_name_unpack2(handle->_msg, handle->_eom, handle->_msg_ptr, + rr->nname, NS_MAXNNAME, &rr->nnamel); + if (b < 0) + return (-1); + handle->_msg_ptr += b; + if (handle->_msg_ptr + NS_INT16SZ + NS_INT16SZ > handle->_eom) + RETERR(EMSGSIZE); + NS_GET16(rr->type, handle->_msg_ptr); + NS_GET16(rr->rr_class, handle->_msg_ptr); + if (section == ns_s_qd) { + rr->ttl = 0; + rr->rdlength = 0; + rr->rdata = NULL; + } else { + if (handle->_msg_ptr + NS_INT32SZ + NS_INT16SZ > handle->_eom) + RETERR(EMSGSIZE); + NS_GET32(rr->ttl, handle->_msg_ptr); + NS_GET16(rr->rdlength, handle->_msg_ptr); + if (handle->_msg_ptr + rr->rdlength > handle->_eom) + RETERR(EMSGSIZE); + rr->rdata = handle->_msg_ptr; + handle->_msg_ptr += rr->rdlength; + } + if (++handle->_rrnum > handle->_counts[(int)section]) + setsection(handle, (ns_sect)((int)section + 1)); + + /* All done. */ + return (0); +} + /* Private. */ static void