diff --git a/dlls/dnsapi/Makefile.in b/dlls/dnsapi/Makefile.in index 36552967be0..d1f66723fc6 100644 --- a/dlls/dnsapi/Makefile.in +++ b/dlls/dnsapi/Makefile.in @@ -6,8 +6,6 @@ EXTRALIBS = $(RESOLV_LIBS) C_SRCS = \ main.c \ name.c \ - ns_name.c \ - ns_parse.c \ query.c \ record.c diff --git a/dlls/dnsapi/dnsapi.h b/dlls/dnsapi/dnsapi.h index 0b679731e91..510555698c7 100644 --- a/dlls/dnsapi/dnsapi.h +++ b/dlls/dnsapi/dnsapi.h @@ -129,10 +129,3 @@ static inline LPSTR dns_strdup_ua( const char *src ) } const char *dns_type_to_str( unsigned short ) DECLSPEC_HIDDEN; - -#ifdef HAVE_RESOLV -int dns_ns_initparse( const u_char *, int, ns_msg * ) DECLSPEC_HIDDEN; -int dns_ns_parserr( ns_msg *, ns_sect, int, ns_rr * ) DECLSPEC_HIDDEN; -int dns_ns_name_skip( const u_char **, const u_char * ) DECLSPEC_HIDDEN; -int dns_ns_name_uncompress( const u_char *, const u_char *, const u_char *, char *, size_t ) DECLSPEC_HIDDEN; -#endif diff --git a/dlls/dnsapi/ns_name.c b/dlls/dnsapi/ns_name.c deleted file mode 100644 index 994aef94459..00000000000 --- a/dlls/dnsapi/ns_name.c +++ /dev/null @@ -1,313 +0,0 @@ -/* - * Copyright (c) 1996,1999 by Internet Software Consortium. - * - * Permission to use, copy, modify, and distribute this software for any - * purpose with or without fee is hereby granted, provided that the above - * copyright notice and this permission notice appear in all copies. - * - * THE SOFTWARE IS PROVIDED "AS IS" AND INTERNET SOFTWARE CONSORTIUM DISCLAIMS - * ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES - * OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL INTERNET SOFTWARE - * CONSORTIUM BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL - * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR - * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS - * ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS - * SOFTWARE. - */ - -#include "config.h" - -#ifdef HAVE_RESOLV - -#include - -#ifdef HAVE_NETINET_IN_H -# include -#endif -#ifdef HAVE_ARPA_NAMESER_H -# include -#endif - -#include -#include -#ifdef HAVE_RESOLV_H -# include -#endif -#include - -/* Data. */ - -static const char digits[] = "0123456789"; - -/* Private. */ - -/* - * special(ch) - * Thinking in noninternationalized USASCII (per the DNS spec), - * is this character special ("in need of quoting") ? - * return: - * boolean. - */ -static int -special(int ch) { - switch (ch) { - case 0x22: /* '"' */ - case 0x2E: /* '.' */ - case 0x3B: /* ';' */ - case 0x5C: /* '\\' */ - /* Special modifiers in zone files. */ - case 0x40: /* '@' */ - case 0x24: /* '$' */ - return (1); - default: - return (0); - } -} - -/* - * printable(ch) - * Thinking in noninternationalized USASCII (per the DNS spec), - * is this character visible and not a space when printed ? - * return: - * boolean. - */ -static int -printable(int ch) { - return (ch > 0x20 && ch < 0x7f); -} - -/* Public. */ - -/* - * dns_ns_name_ntop(src, dst, dstsiz) - * Convert an encoded domain name to printable ascii as per RFC1035. - * return: - * Number of bytes written to buffer, or -1 (with errno set) - * notes: - * The root is returned as "." - * All other domains are returned in non absolute form - */ -static int -dns_ns_name_ntop(const u_char *src, char *dst, size_t dstsiz) { - const u_char *cp; - char *dn, *eom; - u_char c; - u_int n; - - cp = src; - dn = dst; - eom = dst + dstsiz; - - while ((n = *cp++) != 0) { - if ((n & NS_CMPRSFLGS) != 0 && n != 0x41) { - /* Some kind of compression pointer. */ - return (-1); - } - if (dn != dst) { - if (dn >= eom) { - return (-1); - } - *dn++ = '.'; - } - - if (n == 0x41) { - n = *cp++ / 8; - if (dn + n * 2 + 4 >= eom) { - return (-1); - } - *dn++ = '\\'; - *dn++ = '['; - *dn++ = 'x'; - - while (n-- > 0) { - unsigned u; - c = *cp++; - u = c >> 4; - *dn++ = u > 9 ? 'a' + u - 10 : '0' + u; - u = c & 0xf; - *dn++ = u > 9 ? 'a' + u - 10 : '0' + u; - } - - *dn++ = ']'; - continue; - } - - if (dn + n >= eom) { - return (-1); - } - while (n-- > 0) { - c = *cp++; - if (special(c)) { - if (dn + 1 >= eom) { - return (-1); - } - *dn++ = '\\'; - *dn++ = (char)c; - } else if (!printable(c)) { - if (dn + 3 >= eom) { - return (-1); - } - *dn++ = '\\'; - *dn++ = digits[c / 100]; - *dn++ = digits[(c % 100) / 10]; - *dn++ = digits[c % 10]; - } else { - if (dn >= eom) { - return (-1); - } - *dn++ = (char)c; - } - } - } - if (dn == dst) { - if (dn >= eom) { - return (-1); - } - *dn++ = '.'; - } - if (dn >= eom) { - return (-1); - } - *dn++ = '\0'; - return (dn - dst); -} - - -/* - * dns_ns_name_unpack(msg, eom, src, dst, dstsiz) - * Unpack a domain name from a message, source may be compressed. - * return: - * -1 if it fails, or consumed octets if it succeeds. - */ -static int -dns_ns_name_unpack(const u_char *msg, const u_char *eom, const u_char *src, - u_char *dst, size_t dstsiz) -{ - const u_char *srcp, *dstlim; - u_char *dstp; - int n, len, checked; - - len = -1; - checked = 0; - dstp = dst; - srcp = src; - dstlim = dst + dstsiz; - if (srcp < msg || srcp >= eom) { - return (-1); - } - /* Fetch next label in domain name. */ - while ((n = *srcp++) != 0) { - /* Check for indirection. */ - switch (n & NS_CMPRSFLGS) { - case 0x40: - if (n == 0x41) { - if (dstp + 1 >= dstlim) { - return (-1); - } - *dstp++ = 0x41; - n = *srcp++ / 8; - ++checked; - } else { - return (-1); /* flag error */ - } - /* FALLTHROUGH */ - case 0: - /* Limit checks. */ - if (dstp + n + 1 >= dstlim || srcp + n >= eom) { - return (-1); - } - checked += n + 1; - dstp = memcpy(dstp, srcp - 1, n + 1); - dstp += n + 1; - srcp += n; - break; - - case NS_CMPRSFLGS: - if (srcp >= eom) { - return (-1); - } - if (len < 0) - len = srcp - src + 1; - srcp = msg + (((n & 0x3f) << 8) | (*srcp & 0xff)); - if (srcp < msg || srcp >= eom) { /* Out of range. */ - return (-1); - } - checked += 2; - /* - * Check for loops in the compressed name; - * if we've looked at the whole message, - * there must be a loop. - */ - if (checked >= eom - msg) { - return (-1); - } - break; - - default: - return (-1); /* flag error */ - } - } - *dstp = '\0'; - if (len < 0) - len = srcp - src; - return (len); -} - - -/* - * dns_ns_name_uncompress(msg, eom, src, dst, dstsiz) - * Expand compressed domain name to presentation format. - * return: - * Number of bytes read out of `src', or -1 (with errno set). - * note: - * Root domain returns as "." not "". - */ -int -dns_ns_name_uncompress(const u_char *msg, const u_char *eom, const u_char *src, - char *dst, size_t dstsiz) -{ - u_char tmp[NS_MAXCDNAME]; - int n; - - if ((n = dns_ns_name_unpack(msg, eom, src, tmp, sizeof tmp)) == -1) - return (-1); - if (dns_ns_name_ntop(tmp, dst, dstsiz) == -1) - return (-1); - return (n); -} - - -/* - * dns_ns_name_skip(ptrptr, eom) - * Advance *ptrptr to skip over the compressed name it points at. - * return: - * 0 on success, -1 (with errno set) on failure. - */ -int -dns_ns_name_skip(const u_char **ptrptr, const u_char *eom) { - const u_char *cp; - u_int n; - - cp = *ptrptr; - while (cp < eom && (n = *cp++) != 0) { - /* Check for indirection. */ - switch (n & NS_CMPRSFLGS) { - case 0: /* normal case, n == len */ - cp += n; - continue; - case NS_CMPRSFLGS: /* indirection */ - cp++; - break; - default: /* illegal type */ - return (-1); - } - break; - } - if (cp > eom) { - return (-1); - } - *ptrptr = cp; - return (0); -} - -#endif /* HAVE_RESOLV */ diff --git a/dlls/dnsapi/ns_parse.c b/dlls/dnsapi/ns_parse.c deleted file mode 100644 index df4933a82ad..00000000000 --- a/dlls/dnsapi/ns_parse.c +++ /dev/null @@ -1,210 +0,0 @@ -/* - * Copyright (c) 1996,1999 by Internet Software Consortium. - * - * Permission to use, copy, modify, and distribute this software for any - * purpose with or without fee is hereby granted, provided that the above - * copyright notice and this permission notice appear in all copies. - * - * THE SOFTWARE IS PROVIDED "AS IS" AND INTERNET SOFTWARE CONSORTIUM DISCLAIMS - * ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES - * OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL INTERNET SOFTWARE - * CONSORTIUM BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL - * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR - * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS - * ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS - * SOFTWARE. - */ - -#include "config.h" - -#ifdef HAVE_RESOLV - -#include - -#ifdef HAVE_NETINET_IN_H -# include -#endif -#ifdef HAVE_ARPA_NAMESER_H -# include -#endif - -#include -#ifdef HAVE_RESOLV_H -# include -#endif -#include -#include - -#include "windef.h" -#include "winbase.h" -#include "winnls.h" - -#include "dnsapi.h" - -/* Forward. */ - -static void setsection(ns_msg *msg, ns_sect sect); - -/* Macros. */ - -#define RETERR(err) do { return (-1); } while (0) - -#ifdef HAVE_NS_MSG__MSG_PTR -# define NS_PTR(ns_msg) ((ns_msg)->_msg_ptr) -#else -# define NS_PTR(ns_msg) ((ns_msg)->_ptr) -#endif - -#define DNS_NS_GET16(s, cp) do { \ - register const u_char *t_cp = (cp); \ - (s) = ((WORD)t_cp[0] << 8) \ - | ((WORD)t_cp[1]) \ - ; \ - (cp) += NS_INT16SZ; \ -} while (0) - -#define DNS_NS_GET32(l, cp) do { \ - register const u_char *t_cp = (cp); \ - (l) = ((DWORD)t_cp[0] << 24) \ - | ((DWORD)t_cp[1] << 16) \ - | ((DWORD)t_cp[2] << 8) \ - | ((DWORD)t_cp[3]) \ - ; \ - (cp) += NS_INT32SZ; \ -} while (0) - -/* Public. */ - -static int -dns_ns_skiprr(const u_char *ptr, const u_char *eom, ns_sect section, int count) { - const u_char *optr = ptr; - - while (count-- > 0) { - int rdlength; - - if (dns_ns_name_skip(&ptr, eom) < 0) - RETERR(EMSGSIZE); - ptr += NS_INT16SZ/*Type*/ + NS_INT16SZ/*Class*/; - if (section != ns_s_qd) { - if (ptr + NS_INT32SZ + NS_INT16SZ > eom) - RETERR(EMSGSIZE); - ptr += NS_INT32SZ/*TTL*/; - DNS_NS_GET16(rdlength, ptr); - ptr += rdlength/*RData*/; - } - } - if (ptr > eom) - RETERR(EMSGSIZE); - return (ptr - optr); -} - -int -dns_ns_initparse(const u_char *msg, int msglen, ns_msg *handle) { - const u_char *eom = msg + msglen; - int i; - - memset(handle, 0x5e, sizeof *handle); - handle->_msg = msg; - handle->_eom = eom; - if (msg + NS_INT16SZ > eom) - RETERR(EMSGSIZE); - DNS_NS_GET16(handle->_id, msg); - if (msg + NS_INT16SZ > eom) - RETERR(EMSGSIZE); - DNS_NS_GET16(handle->_flags, msg); - for (i = 0; i < ns_s_max; i++) { - if (msg + NS_INT16SZ > eom) - RETERR(EMSGSIZE); - DNS_NS_GET16(handle->_counts[i], msg); - } - for (i = 0; i < ns_s_max; i++) - if (handle->_counts[i] == 0) - handle->_sections[i] = NULL; - else { - int b = dns_ns_skiprr(msg, eom, (ns_sect)i, - handle->_counts[i]); - - if (b < 0) - return (-1); - handle->_sections[i] = msg; - msg += b; - } - if (msg != eom) - RETERR(EMSGSIZE); - setsection(handle, ns_s_max); - return (0); -} - -int -dns_ns_parserr(ns_msg *handle, ns_sect section, int rrnum, ns_rr *rr) { - int b; - - /* Make section right. */ - if (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 = dns_ns_skiprr(NS_PTR(handle), handle->_eom, section, - rrnum - handle->_rrnum); - - if (b < 0) - return (-1); - NS_PTR(handle) += b; - handle->_rrnum = rrnum; - } - - /* Do the parse. */ - b = dn_expand(handle->_msg, handle->_eom, - NS_PTR(handle), rr->name, NS_MAXDNAME); - if (b < 0) - return (-1); - NS_PTR(handle) += b; - if (NS_PTR(handle) + NS_INT16SZ + NS_INT16SZ > handle->_eom) - RETERR(EMSGSIZE); - DNS_NS_GET16(rr->type, NS_PTR(handle)); - DNS_NS_GET16(rr->rr_class, NS_PTR(handle)); - if (section == ns_s_qd) { - rr->ttl = 0; - rr->rdlength = 0; - rr->rdata = NULL; - } else { - if (NS_PTR(handle) + NS_INT32SZ + NS_INT16SZ > handle->_eom) - RETERR(EMSGSIZE); - DNS_NS_GET32(rr->ttl, NS_PTR(handle)); - DNS_NS_GET16(rr->rdlength, NS_PTR(handle)); - if (NS_PTR(handle) + rr->rdlength > handle->_eom) - RETERR(EMSGSIZE); - rr->rdata = NS_PTR(handle); - NS_PTR(handle) += rr->rdlength; - } - if (++handle->_rrnum > handle->_counts[(int)section]) - setsection(handle, (ns_sect)((int)section + 1)); - - /* All done. */ - return (0); -} - -/* Private. */ - -static void -setsection(ns_msg *msg, ns_sect sect) { - msg->_sect = sect; - if (sect == ns_s_max) { - msg->_rrnum = -1; - NS_PTR(msg) = NULL; - } else { - msg->_rrnum = 0; - NS_PTR(msg) = msg->_sections[(int)sect]; - } -} - -#endif diff --git a/dlls/dnsapi/query.c b/dlls/dnsapi/query.c index f540662dfd2..4c7a65eb264 100644 --- a/dlls/dnsapi/query.c +++ b/dlls/dnsapi/query.c @@ -162,7 +162,7 @@ static char *dns_dname_from_msg( ns_msg msg, const unsigned char *pos ) char *str, dname[NS_MAXDNAME] = "."; /* returns *compressed* length, ignore it */ - dns_ns_name_uncompress( ns_msg_base(msg), ns_msg_end(msg), pos, dname, sizeof(dname) ); + ns_name_uncompress( ns_msg_base(msg), ns_msg_end(msg), pos, dname, sizeof(dname) ); len = strlen( dname ); str = heap_alloc( len + 1 ); @@ -282,7 +282,7 @@ static DNS_STATUS dns_copy_rdata( ns_msg msg, const ns_rr *rr, DNS_RECORDA *r, W r->Data.MINFO.pNameMailbox = dns_dname_from_msg( msg, pos ); if (!r->Data.MINFO.pNameMailbox) return ERROR_NOT_ENOUGH_MEMORY; - if (dns_ns_name_skip( &pos, ns_msg_end( msg ) ) < 0) + if (ns_name_skip( &pos, ns_msg_end( msg ) ) < 0) return DNS_ERROR_BAD_PACKET; r->Data.MINFO.pNameErrorsMailbox = dns_dname_from_msg( msg, pos ); @@ -343,7 +343,7 @@ static DNS_STATUS dns_copy_rdata( ns_msg msg, const ns_rr *rr, DNS_RECORDA *r, W r->Data.SIG.pNameSigner = dns_dname_from_msg( msg, pos ); if (!r->Data.SIG.pNameSigner) return ERROR_NOT_ENOUGH_MEMORY; - if (dns_ns_name_skip( &pos, ns_msg_end( msg ) ) < 0) + if (ns_name_skip( &pos, ns_msg_end( msg ) ) < 0) return DNS_ERROR_BAD_PACKET; /* FIXME: byte order? */ @@ -368,7 +368,7 @@ static DNS_STATUS dns_copy_rdata( ns_msg msg, const ns_rr *rr, DNS_RECORDA *r, W r->Data.SOA.pNamePrimaryServer = dns_dname_from_msg( msg, pos ); if (!r->Data.SOA.pNamePrimaryServer) return ERROR_NOT_ENOUGH_MEMORY; - if (dns_ns_name_skip( &pos, ns_msg_end( msg ) ) < 0) + if (ns_name_skip( &pos, ns_msg_end( msg ) ) < 0) return DNS_ERROR_BAD_PACKET; r->Data.SOA.pNameAdministrator = dns_dname_from_msg( msg, pos ); @@ -378,7 +378,7 @@ static DNS_STATUS dns_copy_rdata( ns_msg msg, const ns_rr *rr, DNS_RECORDA *r, W return ERROR_NOT_ENOUGH_MEMORY; } - if (dns_ns_name_skip( &pos, ns_msg_end( msg ) ) < 0) + if (ns_name_skip( &pos, ns_msg_end( msg ) ) < 0) return DNS_ERROR_BAD_PACKET; r->Data.SOA.dwSerialNo = ntohl( *(const DWORD *)pos ); pos += sizeof(DWORD); @@ -447,7 +447,7 @@ static DNS_STATUS dns_copy_record( ns_msg msg, ns_sect section, WORD dlen; ns_rr rr; - if (dns_ns_parserr( &msg, section, num, &rr ) < 0) + if (ns_parserr( &msg, section, num, &rr ) < 0) return DNS_ERROR_BAD_PACKET; if (!(record = heap_alloc_zero( dns_get_record_size( &rr ) ))) @@ -615,7 +615,7 @@ static DNS_STATUS dns_do_query( PCSTR name, WORD type, DWORD options, PDNS_RECOR goto exit; } - if (dns_ns_initparse( answer, len, &msg ) < 0) + if (ns_initparse( answer, len, &msg ) < 0) { ret = DNS_ERROR_BAD_PACKET; goto exit;