1999-12-05 02:05:55 +08:00
|
|
|
/*
|
2008-08-02 01:16:31 +08:00
|
|
|
* Copyright (c) 2004 by Internet Systems Consortium, Inc. ("ISC")
|
1999-12-05 02:05:55 +08:00
|
|
|
* 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.
|
|
|
|
*
|
2008-08-02 01:16:31 +08:00
|
|
|
* THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES
|
|
|
|
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
|
|
|
|
* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL ISC 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.
|
1999-12-05 02:05:55 +08:00
|
|
|
*/
|
|
|
|
|
|
|
|
#include <sys/types.h>
|
|
|
|
|
|
|
|
#include <netinet/in.h>
|
|
|
|
#include <arpa/nameser.h>
|
|
|
|
|
|
|
|
#include <errno.h>
|
|
|
|
#include <resolv.h>
|
|
|
|
#include <string.h>
|
|
|
|
#include <ctype.h>
|
2008-08-02 01:16:31 +08:00
|
|
|
#include <stdlib.h>
|
|
|
|
#include <limits.h>
|
|
|
|
|
|
|
|
# define SPRINTF(x) ((size_t)sprintf x)
|
|
|
|
|
1999-12-05 02:05:55 +08:00
|
|
|
/* Forward. */
|
|
|
|
|
2008-08-02 01:16:31 +08:00
|
|
|
static int labellen(const u_char *);
|
1999-12-05 02:05:55 +08:00
|
|
|
|
|
|
|
/* Public. */
|
|
|
|
|
2008-08-02 01:16:31 +08:00
|
|
|
/*%
|
1999-12-05 02:05:55 +08:00
|
|
|
* Convert a network strings labels into all lowercase.
|
2008-08-02 01:16:31 +08:00
|
|
|
*
|
1999-12-05 02:05:55 +08:00
|
|
|
* return:
|
2008-08-02 01:16:31 +08:00
|
|
|
*\li Number of bytes written to buffer, or -1 (with errno set)
|
|
|
|
*
|
1999-12-05 02:05:55 +08:00
|
|
|
* notes:
|
2008-08-02 01:16:31 +08:00
|
|
|
*\li Enforces label and domain length limits.
|
1999-12-05 02:05:55 +08:00
|
|
|
*/
|
|
|
|
|
|
|
|
int
|
2008-08-02 01:16:31 +08:00
|
|
|
ns_name_ntol(const u_char *src, u_char *dst, size_t dstsiz)
|
|
|
|
{
|
1999-12-05 02:05:55 +08:00
|
|
|
const u_char *cp;
|
|
|
|
u_char *dn, *eom;
|
|
|
|
u_char c;
|
|
|
|
u_int n;
|
2008-08-02 01:16:31 +08:00
|
|
|
int l;
|
1999-12-05 02:05:55 +08:00
|
|
|
|
|
|
|
cp = src;
|
|
|
|
dn = dst;
|
|
|
|
eom = dst + dstsiz;
|
|
|
|
|
2008-08-02 01:16:31 +08:00
|
|
|
if (dn >= eom) {
|
|
|
|
__set_errno (EMSGSIZE);
|
|
|
|
return (-1);
|
|
|
|
}
|
1999-12-05 02:05:55 +08:00
|
|
|
while ((n = *cp++) != 0) {
|
2008-08-02 01:16:31 +08:00
|
|
|
if ((n & NS_CMPRSFLGS) == NS_CMPRSFLGS) {
|
1999-12-05 02:05:55 +08:00
|
|
|
/* Some kind of compression pointer. */
|
|
|
|
__set_errno (EMSGSIZE);
|
|
|
|
return (-1);
|
|
|
|
}
|
|
|
|
*dn++ = n;
|
2008-08-02 01:16:31 +08:00
|
|
|
if ((l = labellen(cp - 1)) < 0) {
|
1999-12-05 02:05:55 +08:00
|
|
|
__set_errno (EMSGSIZE);
|
|
|
|
return (-1);
|
|
|
|
}
|
2008-08-02 01:16:31 +08:00
|
|
|
if (dn + l >= eom) {
|
|
|
|
__set_errno (EMSGSIZE);
|
|
|
|
return (-1);
|
|
|
|
}
|
|
|
|
for ((void)NULL; l > 0; l--) {
|
1999-12-05 02:05:55 +08:00
|
|
|
c = *cp++;
|
|
|
|
if (isupper(c))
|
|
|
|
*dn++ = tolower(c);
|
|
|
|
else
|
|
|
|
*dn++ = c;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
*dn++ = '\0';
|
|
|
|
return (dn - dst);
|
|
|
|
}
|
|
|
|
|
2008-08-02 01:16:31 +08:00
|
|
|
/*%
|
Update.
2000-07-18 Mark Kettenis <kettenis@gnu.org>
Update resolver code to BIND 8.2.3-T5B.
* resolv/Versions [GLIBC_2.2] (libc): Add __res_init and
__res_nclose.
[GLIBC_2.2] (libresolv): Add __dn_expand, __ns_samename,
__res_mkquery, __res_nsend, __res_query, __res_querydomain and
__res_search.
* resolv/Banner: BIND-8.2.3-T5B.
* resolv/base64.c: Update from BIND 8.2.3-T5B.
* resolv/herror.c: Likewise.
* resolv/inet_addr.c: Likewise.
* resolv/inet_net_ntop.c: Likewise.
* resolv/inet_net_pton.c: Likewise.
* resolv/inet_neta.c: Likewise.
* resolv/inet_ntop.c: Likewise.
* resolv/nsap_addr.c: Likewise.
* resolv/inet_pton.c: Likewise. Reject a few more more invalid
IPv6 addresses (ISC bug #520).
* resolv/ns_name.c: Avoid emitting RCS ID in object file.
* resolv/ns_parse.c: Likewise.
* resolv/ns_netint.c: Likewise.
* resolv/ns_samedomain.c: Likewise.
* resolv/ns_ttl.c: Likewise.
* resolv/ns_print.c: Update from BIND 8.2.3-T5B. Avoid emitting
RCS ID in object file.
* resolv/res_debug.c: Update from BIND 8.2.3-T5B.
* resolv/res_mkquery.c: Likewise.
* resolv/res_query.c: Likewise.
* resolv/res_init.c: Likewise.
(res_setoptions): Mark internal.
* resolv/res_send.c: Likewise.
[_LIBC]: Fully reinstate the code that avoids the FD_SETSIZE limit
by using poll instead.
* resolv/res_comp.c: Likewise.
[SHLIB_COMPAT (libresolv, GLIBC_2_0, GLIBC_2_2)]: Make dn_expand a
weak alias for __dn_expand.
* resolv/res_data.c: Likewise.
(res_close) [_LIBC]: Don't call res_nclose if RES_INIT isn't set
in _res.options. Avoids a potential security risk by avoiding a
close (0).
[SHLIB_COMPAT (libresolv, GLIBC_2_0, GLIBC_2_2)]: Make
res_mkquery, res_query, res_querydomain adn res_search weak
aliases for __res_mkquery, __res_query, __res_querydomain and
__res_search.
* resolv/res_libc.c: (_res): Don't initialize. Fix res_close
instead to avoid close(0).
(res_init): Always use the static resolver context.
[SHLIB_COMPAT (libc, GLIBC_2.0, GLIBC_2_2)]: Make res_init a weak
alias for __res_init.
* resolv/resolv.h: Update from BIND 8.2.3-T5B. Move definition of
RES_SET_H_ERRNO and accompanying comment to...
* include/resolv.h: ... here.
* resolv/arpa/namser.h: Update from BIND 8.2.3-T5B.
* resolv/arpa/nameser_compat.h: Likewise.
2000-07-20 06:03:58 +08:00
|
|
|
* Reset dnptrs so that there are no active references to pointers at or
|
|
|
|
* after src.
|
|
|
|
*/
|
|
|
|
void
|
|
|
|
ns_name_rollback(const u_char *src, const u_char **dnptrs,
|
|
|
|
const u_char **lastdnptr)
|
|
|
|
{
|
|
|
|
while (dnptrs < lastdnptr && *dnptrs != NULL) {
|
|
|
|
if (*dnptrs >= src) {
|
|
|
|
*dnptrs = NULL;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
dnptrs++;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
1999-12-05 02:05:55 +08:00
|
|
|
/* Private. */
|
|
|
|
|
2016-10-07 19:43:48 +08:00
|
|
|
/* Return the length of the encoded label starting at LP, or -1 for
|
|
|
|
compression references and extended label types. */
|
2008-08-02 01:16:31 +08:00
|
|
|
static int
|
2016-10-07 19:43:48 +08:00
|
|
|
labellen (const unsigned char *lp)
|
2008-08-02 01:16:31 +08:00
|
|
|
{
|
2016-10-07 19:43:48 +08:00
|
|
|
if (*lp <= 63)
|
|
|
|
return *lp;
|
|
|
|
return -1;
|
2008-08-02 01:16:31 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
/*! \file */
|