diff options
author | Florian Weimer <fweimer@redhat.com> | 2021-07-19 07:55:27 +0200 |
---|---|---|
committer | Florian Weimer <fweimer@redhat.com> | 2021-07-19 07:56:21 +0200 |
commit | 276e9822b3402d49a3c9bea713f89dc855812152 (patch) | |
tree | 1599a1be8b294d39144157e6ac701b19095b8f03 /resolv/ns_name_pton.c | |
parent | 4e1d3db1e86804283cd21f3186e06d397284ac70 (diff) | |
download | glibc-276e9822b3402d49a3c9bea713f89dc855812152.tar.gz glibc-276e9822b3402d49a3c9bea713f89dc855812152.tar.xz glibc-276e9822b3402d49a3c9bea713f89dc855812152.zip |
resolv: Move ns_name_pton into its own file and into libc
And reformat to GNU style, and eliminate the digits variable. The symbol was moved using scripts/move-symbol-to-libc.py. Reviewed-by: Carlos O'Donell <carlos@redhat.com> Tested-by: Carlos O'Donell <carlos@redhat.com>
Diffstat (limited to 'resolv/ns_name_pton.c')
-rw-r--r-- | resolv/ns_name_pton.c | 157 |
1 files changed, 157 insertions, 0 deletions
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 |