Commit Graph
49 Commits
Author SHA1 Message Date
Ondřej Surý 3832e3ecc9 Fixup the missing clang-format bits 2020-02-16 17:34:24 +01:00
Diego Fronza e7b36924e2 Fixed potential-lock-inversion
This commit simplifies a bit the lock management within dns_resolver_prime()
and prime_done() functions by means of turning resolver's attribute
"priming" into an atomic_bool and by creating only one dependent object on the
lock "primelock", namely the "primefetch" attribute.

By having the attribute "priming" as an atomic type, it save us from having to
use a lock just to test if priming is on or off for the given resolver context
object, within "dns_resolver_prime" function.

The "primelock" lock is still necessary, since dns_resolver_prime() function
internally calls dns_resolver_createfetch(), and whenever this function
succeeds it registers an event in the task manager which could be called by
another thread, namely the "prime_done" function, and this function is
responsible for disposing the "primefetch" attribute in the resolver object,
also for resetting "priming" attribute to false.

It is important that the invariant "priming == false AND primefetch == NULL"
remains constant, so that any thread calling "dns_resolver_prime" knows for sure
that if the "priming" attribute is false, "primefetch" attribute should also be
NULL, so a new fetch context could be created to fulfill this purpose, and
assigned to "primefetch" attribute under the lock protection.

To honor the explanation above, dns_resolver_prime is implemented as follow:
	1. Atomically checks the attribute "priming" for the given resolver context.
	2. If "priming" is false, assumes that "primefetch" is NULL (this is
           ensured by the "prime_done" implementation), acquire "primelock"
	   lock and create a new fetch context, update "primefetch" pointer to
	   point to the newly allocated fetch context.
	3. If "priming" is true, assumes that the job is already in progress,
	   no locks are acquired, nothing else to do.

To keep the previous invariant consistent, "prime_done" is implemented as follow:
	1. Acquire "primefetch" lock.
	2. Keep a reference to the current "primefetch" object;
	3. Reset "primefetch" attribute to NULL.
	4. Release "primefetch" lock.
	5. Atomically update "priming" attribute to false.
	6. Destroy the "primefetch" object by using the temporary reference.

This ensures that if "priming" is false, "primefetch" was already reset to NULL.

It doesn't make any difference in having the "priming" attribute not protected
by a lock, since the visible state of this variable would depend on the calling
order of the functions "dns_resolver_prime" and "prime_done".

As an example, suppose that instead of using an atomic for the "priming" attribute
we employed a lock to protect it.
Now suppose that "prime_done" function is called by Thread A, it is then preempted
before acquiring the lock, thus not reseting "priming" to false.
In parallel to that suppose that a Thread B is scheduled and that it calls
"dns_resolver_prime()", it then acquires the lock and check that "priming" is true,
thus it will consider that this resolver object is already priming and it won't do
any more job.
Conversely if the lock order was acquired in the other direction, Thread B would check
that "priming" is false (since prime_done acquired the lock first and set "priming" to false)
and it would initiate a priming fetch for this resolver.

An atomic variable wouldn't change this behavior, since it would behave exactly the
same, depending on the function call order, with the exception that it would avoid
having to use a lock.

There should be no side effects resulting from this change, since the previous
implementation employed use of the more general resolver's "lock" mutex, which
is used in far more contexts, but in the specifics of the "dns_resolver_prime"
and "prime_done" it was only used to protect "primefetch" and "priming" attributes,
which are not used in any of the other critical sections protected by the same lock,
thus having zero dependency on those variables.
2020-02-14 14:28:31 -03:00
Ondřej Surý 654927c871 Add separate .clang-format files for headers 2020-02-14 09:31:05 +01:00
Evan Hunt e851ed0bb5 apply the modified style 2020-02-13 15:05:06 -08:00
Ondřej Surý 056e133c4c Use clang-tidy to add curly braces around one-line statements
The command used to reformat the files in this commit was:

./util/run-clang-tidy \
	-clang-tidy-binary clang-tidy-11
	-clang-apply-replacements-binary clang-apply-replacements-11 \
	-checks=-*,readability-braces-around-statements \
	-j 9 \
	-fix \
	-format \
	-style=file \
	-quiet
clang-format -i --style=format $(git ls-files '*.c' '*.h')
uncrustify -c .uncrustify.cfg --replace --no-backup $(git ls-files '*.c' '*.h')
clang-format -i --style=format $(git ls-files '*.c' '*.h')
2020-02-13 22:07:21 +01:00
Ondřej Surý f50b1e0685 Use clang-format to reformat the source files 2020-02-12 15:04:17 +01:00
Ondřej Surý e2cdf066ea Remove message catalogs 2019-01-09 23:44:26 +01:00
Ondřej Surý 25248eb097 Bail-out early in the for install loops instead of continuing because for masks the error in the middle 2018-09-03 12:05:45 +02:00
Ondřej Surý 994e656977 Replace custom isc_boolean_t with C standard bool type 2018-08-08 09:37:30 +02:00
Ondřej Surý cb6a185c69 Replace custom isc_u?intNN_t types with C99 u?intNN_t types 2018-08-08 09:37:28 +02:00
Ondřej Surý 55a10b7acd Remove $Id markers, Principal Author and Reviewed tags from the full source tree 2018-05-11 13:17:46 +02:00
Evan Hunt 0fabe0da83 update file headers 2018-03-15 18:33:13 -07:00
Ondřej Surý 843d389661 Update license headers to not include years in copyright in all applicable files 2018-02-23 10:12:02 +01:00
Evan Hunt 6087f87afb [master] make uninstall
4503.	[cleanup]	"make uninstall" now removes file installed by
			BIND. (This currently excludes Python files
			due to lack of support in setup.py.) [RT #42912]
2016-11-01 19:17:07 -07:00
Mark Andrews 0c27b3fe77 4401. [misc] Change LICENSE to MPL 2.0. 2016-06-27 14:56:38 +10:00
Tinderbox User 3865e18d3d update copyright notice / whitespace 2015-11-09 23:45:22 +00:00
Evan Hunt e13d04fda9 [master] fix python script versions
4257.	[cleanup]	Python scripts reported incorrect version. [RT #41080]
2015-11-08 21:34:24 -08:00
Tinderbox User aee6c351d3 update copyright notice 2014-11-15 23:45:22 +00:00
Evan Hunt e32d354f75 [master] allow arbitrary-size rndc output
4005.	[func]		The buffer used for returning text from rndc
			commands is now dynamically resizable, allowing
			arbitrarily large amounts of text to be sent back
			to the client. (Prior to this change, it was
			possible for the output of "rndc tsig-list" to be
			truncated.) [RT #37731]
2014-11-14 15:58:54 -08:00
Tinderbox User 431a83fb29 update copyright notice 2014-01-09 23:46:35 +00:00
Evan Hunt e851ea8260 [master] replace memcpy() with memmove().
3698.	[cleanup]	Replaced all uses of memcpy() with memmove().
			[RT #35120]
2014-01-08 16:39:05 -08:00
Tinderbox User cfa2326b5c update copyright notice 2013-03-14 23:46:11 +00:00
Evan Hunt 4eb998928b [master] algorithm flexibility for rndc
3525.	[func]		Support for additional signing algorithms in rndc:
			hmac-sha1, -sha224, -sha256, -sha384, and -sha512.
			The -A option to rndc-confgen can be used to
			select the algorithm for the generated key.
			(The default is still hmac-md5; this may
			change in a future release.) [RT #20363]
2013-03-13 17:53:11 -07:00
Tinderbox User a3128c1995 update copyright notice 2012-06-29 23:45:57 +00:00
Mark Andrews bf8267aa45 reverse bad copyright update 2012-06-29 11:39:47 +10:00
Tinderbox User 247bf37860 update copyright notice 2012-06-29 01:22:18 +00:00
Evan Hunt e41d5a00bc added gitignore, removed cvsignore 2012-03-03 23:10:05 -08:00
Automatic Updater 271c4c7ffa update copyright notice 2007-08-28 07:20:43 +00:00
Automatic Updater 70e5a7403f update copyright notice 2007-06-19 23:47:24 +00:00
Automatic Updater ec5347e2c7 update copyright notice 2007-06-18 23:47:57 +00:00
Mark Andrews 148f27aee6 update copyright notice 2006-12-22 01:59:44 +00:00
Mark Andrews 29747dfe5e 2123. [func] Use Doxygen to generate internal documention.
[RT #11398]
2006-12-22 01:46:19 +00:00
Mark Andrews 69fe9aaafd update copyright notice 2005-04-29 00:24:12 +00:00
Rob Austein ab023a6556 1851. [doc] Doxygen comment markup. [RT #11398] 2005-04-27 04:57:32 +00:00
Mark Andrews dafcb997e3 update copyright notice 2004-03-05 05:14:21 +00:00
Mark Andrews 72ddc4cef9 1480. [bug] Provide replay protection for rndc commands. Full
replay protection requires both rndc and named to
                        be updated.  Partial replay protection (limited
                        exposure after restart) is provided if just named
                        is updated.
2003-07-17 06:24:44 +00:00
Danny Mayer e61793f086 Added LIB*_EXTERNAL_DATA Macros necessary to make lib extern variables globally visible in Win32 2001-11-19 03:08:44 +00:00
Andreas Gustafsson dcfc52bbba Added a version.h file for each library; made version
variables const
2001-10-16 23:21:07 +00:00
Brian Wellington 55ff3f6e65 remove prototypes for nonexistant functions [RT #1240] 2001-05-03 18:40:33 +00:00
Brian Wellington 3f8a9e5196 remove unused byte swapping macros and the associated non-portable includes
[RT #1239]
2001-05-03 18:38:17 +00:00
Brian Wellington ec57fd24fc The isccc headers weren't installed at all. Oops. 2001-04-16 22:50:18 +00:00
Brian Wellington 98e8f87a6d actually list all of the headers. 2001-04-16 22:44:43 +00:00
Brian Wellington d4ef65050f copyright updates
(note - this doesn't touch lib/bind at all.  Mark, whenever you're done with
lib/bind, make sure to do the copyright magic)
2001-04-10 21:52:17 +00:00
Brian Wellington c996e500f1 remove the errno handling code, which was only used by readsymtab/writesymtab 2001-03-28 23:11:41 +00:00
Brian Wellington 0368474a75 remove isccc_cc_readsymtab/isccc_cc_writesymtab 2001-03-28 23:10:39 +00:00
Brian Wellington cb3e854e18 oops, use the nominum copyright for lib/isccc. Also fix the update_copyrights
script to do @YEARS@ expansion on 2 lines.
2001-03-27 20:08:15 +00:00
Andreas Gustafsson 9d2d409333 removed unused function isccc_ccmsg_keepbuffer();
fixed incorrect header multi-inclusion protection macros;
changed comment referring to 'DNS message' to say 'command channel message'
2001-03-27 18:34:56 +00:00
Brian Wellington 022d19c138 copyright updates 2001-03-27 02:06:13 +00:00
Brian Wellington 1d92d8a245 792. [cleanup] Replace the OMAPI command channel protocol with a
simpler one.
2001-03-27 00:44:59 +00:00