Re: [PATCH v2] die(): stop hiding errors due to overzealous recursion guard

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Ævar Arnfjörð Bjarmason  <avarab@xxxxxxxxx> writes:

> So let's just set the recursion limit to a number higher than the
> number of threads we're ever likely to spawn. Now we won't lose
> errors, and if we have a recursing die handler we'll still die within
> microseconds.
>
> There are race conditions in this code itself, in particular the
> "dying" variable is not thread mutexed, so we e.g. won't be dying at
> exactly 1024, or for that matter even be able to accurately test
> "dying == 2", see the cases where we print out more than one "W"
> above.

One case I'd be worried about would be that the race is so bad that
die-is-recursing-builtin never returns 0 even once.  Everybody will
just say "recursing" and die, without giving any useful information.

Will queue, as it is nevertheless an improvement over the current
code.

Thanks.

>  usage.c | 18 +++++++++++++++++-
>  1 file changed, 17 insertions(+), 1 deletion(-)
>
> diff --git a/usage.c b/usage.c
> index 2f87ca69a8..1ea7df9a20 100644
> --- a/usage.c
> +++ b/usage.c
> @@ -44,7 +44,23 @@ static void warn_builtin(const char *warn, va_list params)
>  static int die_is_recursing_builtin(void)
>  {
>  	static int dying;
> -	return dying++;
> +	/*
> +	 * Just an arbitrary number X where "a < x < b" where "a" is
> +	 * "maximum number of pthreads we'll ever plausibly spawn" and
> +	 * "b" is "something less than Inf", since the point is to
> +	 * prevent infinite recursion.
> +	 */
> +	static const int recursion_limit = 1024;
> +
> +	dying++;
> +	if (dying > recursion_limit) {
> +		return 1;
> +	} else if (dying == 2) {
> +		warning("die() called many times. Recursion error or racy threaded death!");
> +		return 0;
> +	} else {
> +		return 0;
> +	}
>  }
>  
>  /* If we are in a dlopen()ed .so write to a global variable would segfault



[Index of Archives]     [Linux Kernel Development]     [Gcc Help]     [IETF Annouce]     [DCCP]     [Netdev]     [Networking]     [Security]     [V4L]     [Bugtraq]     [Yosemite]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Linux SCSI]     [Fedora Users]

  Powered by Linux