From 6815a33d53164e7f1a3b87cec905c17c7a14a007 Mon Sep 17 00:00:00 2001 From: Florian Weimer Date: Wed, 21 Sep 2016 16:30:27 +0200 Subject: [PATCH] resolv: Remove unsupported hook functions from the API [BZ #20016] --- ChangeLog | 15 +++++++++ NEWS | 5 +++ include/resolv.h | 2 -- resolv/Makefile | 2 +- resolv/compat-hooks.c | 56 +++++++++++++++++++++++++++++++++ resolv/res_data.c | 10 ------ resolv/res_init.c | 4 +-- resolv/res_send.c | 85 --------------------------------------------------- resolv/resolv.h | 21 ++----------- 9 files changed, 81 insertions(+), 119 deletions(-) create mode 100644 resolv/compat-hooks.c diff --git a/ChangeLog b/ChangeLog index b6f97dc..96b2a06 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,20 @@ 2016-09-21 Florian Weimer + [BZ #20016] + * resolv/res_send.c (__libc_res_nsend): Remove USE_HOOK code. + * resolv/res_data.c (res_send_setqhook, res_send_setrhook): + Move ... + * resolv/compat-hooks.c (res_send_setqhook, res_send_setrhook): + ... here, as compatibility symbols in a new file. + * resolv/Makefile (libresolv-routines): Add compat-hooks. + * resolv/res_init.c (__res_vinit): Adjust member names. + * include/resolv.h (res_send_setqhook, res_send_setrhook): Remove. + * resolv/resolv.h (res_sendhookact, res_send_qhook) + (res_send_rhook): Remove. + (struct __res_state): Rename qhook, rhook members. + +2016-09-21 Florian Weimer + malloc: Use __libc_lock wrappers. * malloc/arena.c (list_lock, free_list_lock): Define using __libc_lock_define_initialized. diff --git a/NEWS b/NEWS index 26b8045..1c38a61 100644 --- a/NEWS +++ b/NEWS @@ -56,6 +56,11 @@ Version 2.25 meta-RR types is not officially standardized, subject to revision, and thus not suitable for encoding in a macro. +* The types res_sendhookact, res_send_qhook, re_send_rhook, and the qhook + and rhook members of the res_state type in have been removed. + The glibc stub resolver did not support these hooks, but the header file + did not reflect that. + Security related changes: On ARM EABI (32-bit), generating a backtrace for execution contexts which diff --git a/include/resolv.h b/include/resolv.h index 4c61476..d7c98dc 100644 --- a/include/resolv.h +++ b/include/resolv.h @@ -33,8 +33,6 @@ extern u_int32_t _getlong (const u_char *__src); extern u_int16_t _getshort (const u_char *__src); extern void res_pquery (const res_state __statp, const u_char *__msg, int __len, FILE *__file); -extern void res_send_setqhook (res_send_qhook __hook); -extern void res_send_setrhook (res_send_rhook __hook); extern int res_ourserver_p (const res_state __statp, const struct sockaddr_in6 *__inp); extern void __res_iclose (res_state statp, bool free_addr); diff --git a/resolv/Makefile b/resolv/Makefile index 8be41d3..b8b8620 100644 --- a/resolv/Makefile +++ b/resolv/Makefile @@ -46,7 +46,7 @@ libresolv-routines := gethnamaddr res_comp res_debug \ res_data res_mkquery res_query res_send \ inet_net_ntop inet_net_pton inet_neta base64 \ ns_parse ns_name ns_netint ns_ttl ns_print \ - ns_samedomain ns_date + ns_samedomain ns_date compat-hooks libanl-routines := gai_cancel gai_error gai_misc gai_notify gai_suspend \ getaddrinfo_a diff --git a/resolv/compat-hooks.c b/resolv/compat-hooks.c new file mode 100644 index 0000000..5e38260 --- /dev/null +++ b/resolv/compat-hooks.c @@ -0,0 +1,56 @@ +/* Compatibility functions for obsolete libresolv hooks. + Copyright (C) 1999-2016 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, see + . */ + +/* + * Copyright (c) 1995-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 INTERNET SOFTWARE CONSORTIUM DISCLAIMS + * ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL INTERNET SOFTWARE + * CONSORTIUM 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 + +#include + +#if SHLIB_COMPAT (libresolv, GLIBC_2_0, GLIBC_2_25) + +void +attribute_compat_text_section +res_send_setqhook(void *hook) { + _res.__glibc_unused_qhook = hook; +} +compat_symbol (libresolv, res_send_setqhook, res_send_setqhook, GLIBC_2_0); + +void +attribute_compat_text_section +res_send_setrhook(void *hook) { + _res.__glibc_unused_rhook = hook; +} +compat_symbol (libresolv, res_send_setrhook, res_send_setrhook, GLIBC_2_0); + +#endif diff --git a/resolv/res_data.c b/resolv/res_data.c index f44c517..569ff4c 100644 --- a/resolv/res_data.c +++ b/resolv/res_data.c @@ -104,16 +104,6 @@ res_query(const char *name, /* domain name */ return (res_nquery(&_res, name, class, type, answer, anslen)); } -void -res_send_setqhook(res_send_qhook hook) { - _res.qhook = hook; -} - -void -res_send_setrhook(res_send_rhook hook) { - _res.rhook = hook; -} - int res_isourserver(const struct sockaddr_in *inp) { return (res_ourserver_p(&_res, (const struct sockaddr_in6 *) inp)); diff --git a/resolv/res_init.c b/resolv/res_init.c index bfae537..0a01fd5 100644 --- a/resolv/res_init.c +++ b/resolv/res_init.c @@ -144,8 +144,8 @@ __res_vinit(res_state statp, int preinit) { statp->pfcode = 0; statp->_vcsock = -1; statp->_flags = 0; - statp->qhook = NULL; - statp->rhook = NULL; + statp->__glibc_unused_qhook = NULL; + statp->__glibc_unused_rhook = NULL; statp->_u._ext.nscount = 0; for (n = 0; n < MAXNS; n++) statp->_u._ext.nsaddrs[n] = NULL; diff --git a/resolv/res_send.c b/resolv/res_send.c index 869294f..6d46bb2 100644 --- a/resolv/res_send.c +++ b/resolv/res_send.c @@ -364,22 +364,6 @@ __libc_res_nsend(res_state statp, const u_char *buf, int buflen, return (-1); } -#ifdef USE_HOOKS - if (__glibc_unlikely (statp->qhook || statp->rhook)) { - if (anssiz < MAXPACKET && ansp) { - /* Always allocate MAXPACKET, callers expect - this specific size. */ - u_char *buf = malloc (MAXPACKET); - if (buf == NULL) - return (-1); - memcpy (buf, ans, HFIXEDSZ); - *ansp = buf; - ans = buf; - anssiz = MAXPACKET; - } - } -#endif - DprintQ((statp->options & RES_DEBUG) || (statp->pfcode & RES_PRF_QUERY), (stdout, ";; res_send()\n"), buf, buflen); v_circuit = ((statp->options & RES_USEVC) @@ -468,47 +452,10 @@ __libc_res_nsend(res_state statp, const u_char *buf, int buflen, { #ifdef DEBUG char tmpbuf[40]; -#endif -#if defined USE_HOOKS || defined DEBUG struct sockaddr *nsap = get_nsaddr (statp, ns); #endif same_ns: -#ifdef USE_HOOKS - if (__glibc_unlikely (statp->qhook != NULL)) { - int done = 0, loops = 0; - - do { - res_sendhookact act; - - struct sockaddr_in *nsap4; - nsap4 = (struct sockaddr_in *) nsap; - act = (*statp->qhook)(&nsap4, &buf, &buflen, - ans, anssiz, &resplen); - nsap = (struct sockaddr_in6 *) nsap4; - switch (act) { - case res_goahead: - done = 1; - break; - case res_nextns: - __res_iclose(statp, false); - goto next_ns; - case res_done: - return (resplen); - case res_modified: - /* give the hook another try */ - if (++loops < 42) /*doug adams*/ - break; - /*FALLTHROUGH*/ - case res_error: - /*FALLTHROUGH*/ - default: - return (-1); - } - } while (!done); - } -#endif - Dprint(statp->options & RES_DEBUG, (stdout, ";; Querying server (# %d) address = %s\n", ns + 1, inet_ntop(nsap->sa_family, @@ -571,38 +518,6 @@ __libc_res_nsend(res_state statp, const u_char *buf, int buflen, (statp->options & RES_STAYOPEN) == 0) { __res_iclose(statp, false); } -#ifdef USE_HOOKS - if (__glibc_unlikely (statp->rhook)) { - int done = 0, loops = 0; - - do { - res_sendhookact act; - - act = (*statp->rhook)((struct sockaddr_in *) - nsap, buf, buflen, - ans, anssiz, &resplen); - switch (act) { - case res_goahead: - case res_done: - done = 1; - break; - case res_nextns: - __res_iclose(statp, false); - goto next_ns; - case res_modified: - /* give the hook another try */ - if (++loops < 42) /*doug adams*/ - break; - /*FALLTHROUGH*/ - case res_error: - /*FALLTHROUGH*/ - default: - return (-1); - } - } while (!done); - - } -#endif return (resplen); next_ns: ; } /*foreach ns*/ diff --git a/resolv/resolv.h b/resolv/resolv.h index f55e7ce..a6f4dad 100644 --- a/resolv/resolv.h +++ b/resolv/resolv.h @@ -68,23 +68,6 @@ #ifndef __res_state_defined # define __res_state_defined -typedef enum { res_goahead, res_nextns, res_modified, res_done, res_error } - res_sendhookact; - -typedef res_sendhookact (*res_send_qhook) (struct sockaddr_in * const *__ns, - const u_char **__query, - int *__querylen, - u_char *__ans, - int __anssiz, - int *__resplen); - -typedef res_sendhookact (*res_send_rhook) (const struct sockaddr_in *__ns, - const u_char *__query, - int __querylen, - u_char *__ans, - int __anssiz, - int *__resplen); - /* * Global defines and variables for resolver stub. */ @@ -123,8 +106,8 @@ struct __res_state { u_int32_t mask; } sort_list[MAXRESOLVSORT]; /* 4 byte hole here on 64-bit architectures. */ - res_send_qhook qhook; /* query hook */ - res_send_rhook rhook; /* response hook */ + void * __glibc_unused_qhook; + void * __glibc_unused_rhook; int res_h_errno; /* last one set for this context */ int _vcsock; /* PRIVATE: for res_send VC i/o */ u_int _flags; /* PRIVATE: see below */ -- 2.7.4