diff options
author | Florian Weimer <fweimer@redhat.com> | 2021-07-15 08:28:50 +0200 |
---|---|---|
committer | Florian Weimer <fweimer@redhat.com> | 2021-07-15 08:39:31 +0200 |
commit | adcc572a29169e5b571ab06b1a5bf941985d8fe6 (patch) | |
tree | 77aebfcb3ff5acaddaaed71e70abde4d39399942 /resolv/ns_name.c | |
parent | 2ff32dd4926c7ec3bb6c09b58a12a8e828a4cc58 (diff) | |
download | glibc-adcc572a29169e5b571ab06b1a5bf941985d8fe6.tar.gz glibc-adcc572a29169e5b571ab06b1a5bf941985d8fe6.tar.xz glibc-adcc572a29169e5b571ab06b1a5bf941985d8fe6.zip |
resolv: Move ns_name_ntop to its own file and into libc
Reformat to GNU style. Avoid out-of-bounds pointer arithmetic (e.g., use eom - dn < 2 instead of dn + 1 >= eom). Inline the labellen function and fold the compression pointer check into the length check (l >= 64). Assume ASCII encoding. 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.c')
-rw-r--r-- | resolv/ns_name.c | 128 |
1 files changed, 1 insertions, 127 deletions
diff --git a/resolv/ns_name.c b/resolv/ns_name.c index 73213fee2d..4990003746 100644 --- a/resolv/ns_name.c +++ b/resolv/ns_name.c @@ -35,8 +35,6 @@ static const char digits[] = "0123456789"; /* Forward. */ -static int special(int); -static int printable(int); static int dn_find(const u_char *, const u_char *, const u_char * const *, const u_char * const *); @@ -44,93 +42,6 @@ static int labellen(const u_char *); /* Public. */ -/*% - * Convert an encoded domain name to printable ascii as per RFC1035. - - * return: - *\li Number of bytes written to buffer, or -1 (with errno set) - * - * notes: - *\li The root is returned as "." - *\li All other domains are returned in non absolute form - */ -int -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; - int l; - - cp = src; - dn = dst; - eom = dst + dstsiz; - - while ((n = *cp++) != 0) { - if ((n & NS_CMPRSFLGS) == NS_CMPRSFLGS) { - /* Some kind of compression pointer. */ - __set_errno (EMSGSIZE); - return (-1); - } - if (dn != dst) { - if (dn >= eom) { - __set_errno (EMSGSIZE); - return (-1); - } - *dn++ = '.'; - } - if ((l = labellen(cp - 1)) < 0) { - __set_errno (EMSGSIZE); - return(-1); - } - if (dn + l >= eom) { - __set_errno (EMSGSIZE); - return (-1); - } - for ((void)NULL; l > 0; l--) { - c = *cp++; - if (special(c)) { - if (dn + 1 >= eom) { - __set_errno (EMSGSIZE); - return (-1); - } - *dn++ = '\\'; - *dn++ = (char)c; - } else if (!printable(c)) { - if (dn + 3 >= eom) { - __set_errno (EMSGSIZE); - return (-1); - } - *dn++ = '\\'; - *dn++ = digits[c / 100]; - *dn++ = digits[(c % 100) / 10]; - *dn++ = digits[c % 10]; - } else { - if (dn >= eom) { - __set_errno (EMSGSIZE); - return (-1); - } - *dn++ = (char)c; - } - } - } - if (dn == dst) { - if (dn >= eom) { - __set_errno (EMSGSIZE); - return (-1); - } - *dn++ = '.'; - } - if (dn >= eom) { - __set_errno (EMSGSIZE); - return (-1); - } - *dn++ = '\0'; - return (dn - dst); -} -libresolv_hidden_def (ns_name_ntop) -strong_alias (ns_name_ntop, __ns_name_ntop) /*% * Convert an ascii string into an encoded domain name as per RFC1035. @@ -517,7 +428,7 @@ ns_name_uncompress(const u_char *msg, const u_char *eom, const u_char *src, if ((n = ns_name_unpack(msg, eom, src, tmp, sizeof tmp)) == -1) return (-1); - if (ns_name_ntop(tmp, dst, dstsiz) == -1) + if (__ns_name_ntop (tmp, dst, dstsiz) == -1) return (-1); return (n); } @@ -608,43 +519,6 @@ libresolv_hidden_def (ns_name_skip) /*% * Thinking in noninternationalized USASCII (per the DNS spec), - * is this character special ("in need of quoting") ? - * - * return: - *\li boolean. - */ -static int -special(int ch) { - switch (ch) { - case 0x22: /*%< '"' */ - case 0x2E: /*%< '.' */ - case 0x3B: /*%< ';' */ - case 0x5C: /*%< '\\' */ - case 0x28: /*%< '(' */ - case 0x29: /*%< ')' */ - /* Special modifiers in zone files. */ - case 0x40: /*%< '@' */ - case 0x24: /*%< '$' */ - return (1); - default: - return (0); - } -} - -/*% - * Thinking in noninternationalized USASCII (per the DNS spec), - * is this character visible and not a space when printed ? - * - * return: - *\li boolean. - */ -static int -printable(int ch) { - return (ch > 0x20 && ch < 0x7f); -} - -/*% - * Thinking in noninternationalized USASCII (per the DNS spec), * convert this character to lower case if it's upper case. */ static int |