8597553f96
- Support an arbitrary number of search domains (#168253) - Detect and apply /etc/resolv.conf changes in libresolv (#1374239) - CVE-2015-5180: DNS stub resolver crash with crafted record type (#1251403)
185 lines
6.5 KiB
Diff
185 lines
6.5 KiB
Diff
commit b87d47396f8e036a111fed8816254cfe1cf87cb2
|
||
Author: Florian Weimer <fweimer@redhat.com>
|
||
Date: Fri Jun 23 18:10:41 2017 +0200
|
||
|
||
resolv/res_libc.c: Reformat to GNU style
|
||
|
||
diff --git a/resolv/res_libc.c b/resolv/res_libc.c
|
||
index 5202b756ff17518a..4b979f39a7c8e8ba 100644
|
||
--- a/resolv/res_libc.c
|
||
+++ b/resolv/res_libc.c
|
||
@@ -1,3 +1,21 @@
|
||
+/* Definitions related to res_init linked into libc instead of libresolv.
|
||
+ Copyright (C) 1995-2017 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
|
||
+ <http://www.gnu.org/licenses/>. */
|
||
+
|
||
/*
|
||
* Copyright (c) 1995-1999 by Internet Software Consortium.
|
||
*
|
||
@@ -15,9 +33,6 @@
|
||
* SOFTWARE.
|
||
*/
|
||
|
||
-/* This file contains the definitions related to res_init which are
|
||
- linked into libc instead of libresolv. */
|
||
-
|
||
#include <atomic.h>
|
||
#include <limits.h>
|
||
#include <sys/types.h>
|
||
@@ -40,74 +55,78 @@ __libc_lock_define_initialized (static, lock);
|
||
#endif
|
||
|
||
int
|
||
-res_init(void) {
|
||
- /*
|
||
- * These three fields used to be statically initialized. This made
|
||
- * it hard to use this code in a shared library. It is necessary,
|
||
- * now that we're doing dynamic initialization here, that we preserve
|
||
- * the old semantics: if an application modifies one of these three
|
||
- * fields of _res before res_init() is called, res_init() will not
|
||
- * alter them. Of course, if an application is setting them to
|
||
- * _zero_ before calling res_init(), hoping to override what used
|
||
- * to be the static default, we can't detect it and unexpected results
|
||
- * will follow. Zero for any of these fields would make no sense,
|
||
- * so one can safely assume that the applications were already getting
|
||
- * unexpected results.
|
||
- *
|
||
- * _res.options is tricky since some apps were known to diddle the bits
|
||
- * before res_init() was first called. We can't replicate that semantic
|
||
- * with dynamic initialization (they may have turned bits off that are
|
||
- * set in RES_DEFAULT). Our solution is to declare such applications
|
||
- * "broken". They could fool us by setting RES_INIT but none do (yet).
|
||
- */
|
||
- if (!_res.retrans)
|
||
- _res.retrans = RES_TIMEOUT;
|
||
- if (!_res.retry)
|
||
- _res.retry = RES_DFLRETRY;
|
||
- if (!(_res.options & RES_INIT))
|
||
- _res.options = RES_DEFAULT;
|
||
- else if (_res.nscount > 0)
|
||
- __res_iclose (&_res, true); /* Close any VC sockets. */
|
||
-
|
||
- /*
|
||
- * This one used to initialize implicitly to zero, so unless the app
|
||
- * has set it to something in particular, we can randomize it now.
|
||
- */
|
||
- if (!_res.id)
|
||
- _res.id = res_randomid();
|
||
-
|
||
- atomicinclock (lock);
|
||
- /* Request all threads to re-initialize their resolver states,
|
||
- resolv.conf might have changed. */
|
||
- atomicinc (__res_initstamp);
|
||
- atomicincunlock (lock);
|
||
-
|
||
- return (__res_vinit(&_res, 1));
|
||
+res_init (void)
|
||
+{
|
||
+ /* These three fields used to be statically initialized. This made
|
||
+ it hard to use this code in a shared library. It is necessary,
|
||
+ now that we're doing dynamic initialization here, that we
|
||
+ preserve the old semantics: if an application modifies one of
|
||
+ these three fields of _res before res_init is called,
|
||
+ res_init will not alter them. Of course, if an application is
|
||
+ setting them to _zero_ before calling res_init, hoping to
|
||
+ override what used to be the static default, we can't detect it
|
||
+ and unexpected results will follow. Zero for any of these fields
|
||
+ would make no sense, so one can safely assume that the
|
||
+ applications were already getting unexpected results.
|
||
+
|
||
+ _res.options is tricky since some apps were known to diddle the
|
||
+ bits before res_init was first called. We can't replicate that
|
||
+ semantic with dynamic initialization (they may have turned bits
|
||
+ off that are set in RES_DEFAULT). Our solution is to declare
|
||
+ such applications "broken". They could fool us by setting
|
||
+ RES_INIT but none do (yet). */
|
||
+ if (!_res.retrans)
|
||
+ _res.retrans = RES_TIMEOUT;
|
||
+ if (!_res.retry)
|
||
+ _res.retry = RES_DFLRETRY;
|
||
+ if (!(_res.options & RES_INIT))
|
||
+ _res.options = RES_DEFAULT;
|
||
+ else if (_res.nscount > 0)
|
||
+ __res_iclose (&_res, true); /* Close any VC sockets. */
|
||
+
|
||
+ /* This one used to initialize implicitly to zero, so unless the app
|
||
+ has set it to something in particular, we can randomize it *
|
||
+ now. */
|
||
+ if (!_res.id)
|
||
+ _res.id = res_randomid ();
|
||
+
|
||
+ atomicinclock (lock);
|
||
+ /* Request all threads to re-initialize their resolver states,
|
||
+ resolv.conf might have changed. */
|
||
+ atomicinc (__res_initstamp);
|
||
+ atomicincunlock (lock);
|
||
+
|
||
+ return __res_vinit (&_res, 1);
|
||
}
|
||
|
||
-/* Initialize resp if RES_INIT is not yet set or if res_init in some other
|
||
- thread requested re-initializing. */
|
||
+/* Initialize *RESP if RES_INIT is not yet set in RESP->options, or if
|
||
+ res_init in some other thread requested re-initializing. */
|
||
int
|
||
__res_maybe_init (res_state resp, int preinit)
|
||
{
|
||
- if (resp->options & RES_INIT) {
|
||
- if (__res_initstamp != resp->_u._ext.initstamp) {
|
||
- if (resp->nscount > 0)
|
||
- __res_iclose (resp, true);
|
||
- return __res_vinit (resp, 1);
|
||
- }
|
||
- return 0;
|
||
- } else if (preinit) {
|
||
- if (!resp->retrans)
|
||
- resp->retrans = RES_TIMEOUT;
|
||
- if (!resp->retry)
|
||
- resp->retry = RES_DFLRETRY;
|
||
- resp->options = RES_DEFAULT;
|
||
- if (!resp->id)
|
||
- resp->id = res_randomid ();
|
||
- return __res_vinit (resp, 1);
|
||
- } else
|
||
- return __res_ninit (resp);
|
||
+ if (resp->options & RES_INIT)
|
||
+ {
|
||
+ if (__res_initstamp != resp->_u._ext.initstamp)
|
||
+ {
|
||
+ if (resp->nscount > 0)
|
||
+ __res_iclose (resp, true);
|
||
+ return __res_vinit (resp, 1);
|
||
+ }
|
||
+ return 0;
|
||
+ }
|
||
+ else if (preinit)
|
||
+ {
|
||
+ if (!resp->retrans)
|
||
+ resp->retrans = RES_TIMEOUT;
|
||
+ if (!resp->retry)
|
||
+ resp->retry = RES_DFLRETRY;
|
||
+ resp->options = RES_DEFAULT;
|
||
+ if (!resp->id)
|
||
+ resp->id = res_randomid ();
|
||
+ return __res_vinit (resp, 1);
|
||
+ }
|
||
+ else
|
||
+ return __res_ninit (resp);
|
||
}
|
||
libc_hidden_def (__res_maybe_init)
|
||
|