diff options
Diffstat (limited to 'resolv')
-rw-r--r-- | resolv/Makefile | 1 | ||||
-rw-r--r-- | resolv/Versions | 3 | ||||
-rw-r--r-- | resolv/ns_name.c | 125 | ||||
-rw-r--r-- | resolv/ns_name_pton.c | 157 |
4 files changed, 161 insertions, 125 deletions
diff --git a/resolv/Makefile b/resolv/Makefile index 3145ddebb7..7839e1fb3c 100644 --- a/resolv/Makefile +++ b/resolv/Makefile @@ -33,6 +33,7 @@ routines := \ inet_ntop \ inet_pton \ ns_name_ntop \ + ns_name_pton \ ns_name_skip \ ns_name_uncompress \ ns_name_unpack \ diff --git a/resolv/Versions b/resolv/Versions index 9e8762f984..770a2b8d6b 100644 --- a/resolv/Versions +++ b/resolv/Versions @@ -26,6 +26,7 @@ libc { } GLIBC_2.9 { ns_name_ntop; + ns_name_pton; ns_name_skip; ns_name_uncompress; ns_name_unpack; @@ -38,6 +39,7 @@ libc { getaddrinfo_a; %endif ns_name_ntop; + ns_name_pton; ns_name_skip; ns_name_uncompress; ns_name_unpack; @@ -50,6 +52,7 @@ libc { __inet_aton_exact; __inet_pton_length; __ns_name_ntop; + __ns_name_pton; __ns_name_skip; __ns_name_uncompress; __ns_name_unpack; diff --git a/resolv/ns_name.c b/resolv/ns_name.c index 35e25cbd83..9f7ca4a506 100644 --- a/resolv/ns_name.c +++ b/resolv/ns_name.c @@ -29,10 +29,6 @@ # define SPRINTF(x) ((size_t)sprintf x) -/* Data. */ - -static const char digits[] = "0123456789"; - /* Forward. */ static int dn_find(const u_char *, const u_char *, @@ -42,127 +38,6 @@ static int labellen(const u_char *); /* Public. */ - -/*% - * Convert an ascii string into an encoded domain name as per RFC1035. - * - * return: - * - *\li -1 if it fails - *\li 1 if string was fully qualified - *\li 0 is string was not fully qualified - * - * notes: - *\li Enforces label and domain length limits. - */ - -int -ns_name_pton(const char *src, u_char *dst, size_t dstsiz) -{ - u_char *label, *bp, *eom; - int c, n, escaped; - char *cp; - - escaped = 0; - bp = dst; - eom = dst + dstsiz; - label = bp++; - - while ((c = *src++) != 0) { - if (escaped) { - if ((cp = strchr(digits, c)) != NULL) { - n = (cp - digits) * 100; - if ((c = *src++) == 0 || - (cp = strchr(digits, c)) == NULL) { - __set_errno (EMSGSIZE); - return (-1); - } - n += (cp - digits) * 10; - if ((c = *src++) == 0 || - (cp = strchr(digits, c)) == NULL) { - __set_errno (EMSGSIZE); - return (-1); - } - n += (cp - digits); - if (n > 255) { - __set_errno (EMSGSIZE); - return (-1); - } - c = n; - } - escaped = 0; - } else if (c == '\\') { - escaped = 1; - continue; - } else if (c == '.') { - c = (bp - label - 1); - if ((c & NS_CMPRSFLGS) != 0) { /*%< Label too big. */ - __set_errno (EMSGSIZE); - return (-1); - } - if (label >= eom) { - __set_errno (EMSGSIZE); - return (-1); - } - *label = c; - /* Fully qualified ? */ - if (*src == '\0') { - if (c != 0) { - if (bp >= eom) { - __set_errno (EMSGSIZE); - return (-1); - } - *bp++ = '\0'; - } - if ((bp - dst) > MAXCDNAME) { - __set_errno (EMSGSIZE); - return (-1); - } - return (1); - } - if (c == 0 || *src == '.') { - __set_errno (EMSGSIZE); - return (-1); - } - label = bp++; - continue; - } - if (bp >= eom) { - __set_errno (EMSGSIZE); - return (-1); - } - *bp++ = (u_char)c; - } - if (escaped) { - /* Trailing backslash. */ - __set_errno (EMSGSIZE); - return -1; - } - c = (bp - label - 1); - if ((c & NS_CMPRSFLGS) != 0) { /*%< Label too big. */ - __set_errno (EMSGSIZE); - return (-1); - } - if (label >= eom) { - __set_errno (EMSGSIZE); - return (-1); - } - *label = c; - if (c != 0) { - if (bp >= eom) { - __set_errno (EMSGSIZE); - return (-1); - } - *bp++ = 0; - } - if ((bp - dst) > MAXCDNAME) { /*%< src too big */ - __set_errno (EMSGSIZE); - return (-1); - } - return (0); -} -libresolv_hidden_def (ns_name_pton) - /*% * Convert a network strings labels into all lowercase. * diff --git a/resolv/ns_name_pton.c b/resolv/ns_name_pton.c new file mode 100644 index 0000000000..16f8ec8303 --- /dev/null +++ b/resolv/ns_name_pton.c @@ -0,0 +1,157 @@ +/* Convert a DNS domain name from presentation to wire format. + * Copyright (c) 2004 by Internet Systems Consortium, Inc. ("ISC") + * 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 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. + */ + +#include <arpa/nameser.h> +#include <errno.h> +#include <shlib-compat.h> + +/* Converts an ASCII string into an encoded domain name as per + RFC1035. Returns -1 if it fails, 1 if string was fully qualified, + 0 is string was not fully qualified. Enforces label and domain + length limits. */ +int +___ns_name_pton (const char *src, unsigned char *dst, size_t dstsiz) +{ + unsigned char *label, *bp, *eom; + int c, n, escaped; + + escaped = 0; + bp = dst; + eom = dst + dstsiz; + label = bp++; + + while ((c = *src++) != 0) + { + if (escaped) + { + if ('0' <= c && c <= '9') + { + n = (c - '0') * 100; + if ((c = *src++) == 0 || c < '0' || c > '9') + { + __set_errno (EMSGSIZE); + return -1; + } + n += (c - '0') * 10; + if ((c = *src++) == 0 || c < '0' || c > '9') + { + __set_errno (EMSGSIZE); + return -1; + } + n += c - '0'; + if (n > 255) + { + __set_errno (EMSGSIZE); + return -1; + } + c = n; + } + escaped = 0; + } + else if (c == '\\') + { + escaped = 1; + continue; + } + else if (c == '.') + { + c = (bp - label - 1); + if ((c & NS_CMPRSFLGS) != 0) /* Label too big. */ + { + __set_errno (EMSGSIZE); + return -1; + } + if (label >= eom) + { + __set_errno (EMSGSIZE); + return -1; + } + *label = c; + /* Fully qualified ? */ + if (*src == '\0') + { + if (c != 0) + { + if (bp >= eom) + { + __set_errno (EMSGSIZE); + return -1; + } + *bp++ = '\0'; + } + if ((bp - dst) > MAXCDNAME) + { + __set_errno (EMSGSIZE); + return -1; + } + return 1; + } + if (c == 0 || *src == '.') + { + __set_errno (EMSGSIZE); + return -1; + } + label = bp++; + continue; + } + if (bp >= eom) + { + __set_errno (EMSGSIZE); + return -1; + } + *bp++ = (unsigned char) c; + } + if (escaped) /* Trailing backslash. */ + { + __set_errno (EMSGSIZE); + return -1; + } + c = (bp - label - 1); + if ((c & NS_CMPRSFLGS) != 0) /* Label too big. */ + { + __set_errno (EMSGSIZE); + return -1; + } + if (label >= eom) + { + __set_errno (EMSGSIZE); + return -1; + } + *label = c; + if (c != 0) + { + if (bp >= eom) + { + __set_errno (EMSGSIZE); + return -1; + } + *bp++ = 0; + } + if ((bp - dst) > MAXCDNAME) /* src too big. */ + { + __set_errno (EMSGSIZE); + return -1; + } + return 0; +} +versioned_symbol (libc, ___ns_name_pton, ns_name_pton, GLIBC_2_34); +versioned_symbol (libc, ___ns_name_pton, __ns_name_pton, GLIBC_PRIVATE); +libc_hidden_ver (___ns_name_pton, __ns_name_pton) + +#if OTHER_SHLIB_COMPAT (libresolv, GLIBC_2_9, GLIBC_2_34) +compat_symbol (libresolv, ___ns_name_pton, ns_name_pton, GLIBC_2_9); +#endif |