diff options
69 files changed, 274 insertions, 227 deletions
diff --git a/include/arpa/nameser.h b/include/arpa/nameser.h index c27008b5ff..02d7b0b553 100644 --- a/include/arpa/nameser.h +++ b/include/arpa/nameser.h @@ -65,7 +65,6 @@ libresolv_hidden_proto (ns_put32) libresolv_hidden_proto (ns_initparse) libresolv_hidden_proto (ns_skiprr) libresolv_hidden_proto (ns_parserr) -libresolv_hidden_proto (ns_name_pack) libresolv_hidden_proto (ns_name_compress) libresolv_hidden_proto (ns_sprintrr) libresolv_hidden_proto (ns_sprintrrf) @@ -76,6 +75,8 @@ libresolv_hidden_proto (ns_format_ttl) extern __typeof (ns_name_ntop) __ns_name_ntop; libc_hidden_proto (__ns_name_ntop) +extern __typeof (ns_name_pack) __ns_name_pack; +libc_hidden_proto (__ns_name_pack) extern __typeof (ns_name_pton) __ns_name_pton; libc_hidden_proto (__ns_name_pton) extern __typeof (ns_name_skip) __ns_name_skip; diff --git a/resolv/Makefile b/resolv/Makefile index 7839e1fb3c..8bb2585dca 100644 --- a/resolv/Makefile +++ b/resolv/Makefile @@ -33,6 +33,7 @@ routines := \ inet_ntop \ inet_pton \ ns_name_ntop \ + ns_name_pack \ ns_name_pton \ ns_name_skip \ ns_name_uncompress \ diff --git a/resolv/Versions b/resolv/Versions index 770a2b8d6b..8ea42da48d 100644 --- a/resolv/Versions +++ b/resolv/Versions @@ -26,6 +26,7 @@ libc { } GLIBC_2.9 { ns_name_ntop; + ns_name_pack; ns_name_pton; ns_name_skip; ns_name_uncompress; @@ -39,6 +40,7 @@ libc { getaddrinfo_a; %endif ns_name_ntop; + ns_name_pack; ns_name_pton; ns_name_skip; ns_name_uncompress; @@ -52,6 +54,7 @@ libc { __inet_aton_exact; __inet_pton_length; __ns_name_ntop; + __ns_name_pack; __ns_name_pton; __ns_name_skip; __ns_name_uncompress; @@ -154,7 +157,6 @@ libresolv { ns_msg_getflag; ns_name_compress; ns_name_ntol; - ns_name_pack; ns_name_pton; ns_name_rollback; ns_name_skip; diff --git a/resolv/ns_name.c b/resolv/ns_name.c index 9f7ca4a506..f1a84ad8a6 100644 --- a/resolv/ns_name.c +++ b/resolv/ns_name.c @@ -31,9 +31,6 @@ /* Forward. */ -static int dn_find(const u_char *, const u_char *, - const u_char * const *, - const u_char * const *); static int labellen(const u_char *); /* Public. */ @@ -93,118 +90,6 @@ ns_name_ntol(const u_char *src, u_char *dst, size_t dstsiz) } /*% - * Pack domain name 'domain' into 'comp_dn'. - * - * return: - *\li Size of the compressed name, or -1. - * - * notes: - *\li 'dnptrs' is an array of pointers to previous compressed names. - *\li dnptrs[0] is a pointer to the beginning of the message. The array - * ends with NULL. - *\li 'lastdnptr' is a pointer to the end of the array pointed to - * by 'dnptrs'. - * - * Side effects: - *\li The list of pointers in dnptrs is updated for labels inserted into - * the message as we compress the name. If 'dnptr' is NULL, we don't - * try to compress names. If 'lastdnptr' is NULL, we don't update the - * list. - */ -int -ns_name_pack(const u_char *src, u_char *dst, int dstsiz, - const u_char **dnptrs, const u_char **lastdnptr) -{ - u_char *dstp; - const u_char **cpp, **lpp, *eob, *msg; - const u_char *srcp; - int n, l, first = 1; - - srcp = src; - dstp = dst; - eob = dstp + dstsiz; - lpp = cpp = NULL; - if (dnptrs != NULL) { - if ((msg = *dnptrs++) != NULL) { - for (cpp = dnptrs; *cpp != NULL; cpp++) - (void)NULL; - lpp = cpp; /*%< end of list to search */ - } - } else - msg = NULL; - - /* make sure the domain we are about to add is legal */ - l = 0; - do { - int l0; - - n = *srcp; - if ((n & NS_CMPRSFLGS) == NS_CMPRSFLGS) { - __set_errno (EMSGSIZE); - return (-1); - } - if ((l0 = labellen(srcp)) < 0) { - __set_errno (EINVAL); - return(-1); - } - l += l0 + 1; - if (l > MAXCDNAME) { - __set_errno (EMSGSIZE); - return (-1); - } - srcp += l0 + 1; - } while (n != 0); - - /* from here on we need to reset compression pointer array on error */ - srcp = src; - do { - /* Look to see if we can use pointers. */ - n = *srcp; - if (n != 0 && msg != NULL) { - l = dn_find(srcp, msg, (const u_char * const *)dnptrs, - (const u_char * const *)lpp); - if (l >= 0) { - if (dstp + 1 >= eob) { - goto cleanup; - } - *dstp++ = (l >> 8) | NS_CMPRSFLGS; - *dstp++ = l % 256; - return (dstp - dst); - } - /* Not found, save it. */ - if (lastdnptr != NULL && cpp < lastdnptr - 1 && - (dstp - msg) < 0x4000 && first) { - *cpp++ = dstp; - *cpp = NULL; - first = 0; - } - } - /* copy label to buffer */ - if ((n & NS_CMPRSFLGS) == NS_CMPRSFLGS) { - /* Should not happen. */ - goto cleanup; - } - n = labellen(srcp); - if (n + 1 > eob - dstp) { - goto cleanup; - } - memcpy(dstp, srcp, n + 1); - srcp += n + 1; - dstp += n + 1; - } while (n != 0); - - if (dstp > eob) { -cleanup: - if (msg != NULL) - *lpp = NULL; - __set_errno (EMSGSIZE); - return (-1); - } - return (dstp - dst); -} -libresolv_hidden_def (ns_name_pack) - -/*% * Compress a domain name into wire format, using |
