[PATCH 3/3] platform: fix missing sigisemptyset

Rich Felker dalias at aerifal.cx
Wed Nov 27 01:46:13 UTC 2013


On Tue, Nov 26, 2013 at 10:01:36PM +0200, Daniel Borca wrote:
> +#ifndef HAVE_SIGISEMPTYSET
> +int sigisemptyset(sigset_t *set)
> +{
> +	sigset_t empty;
> +	int ret = sigemptyset(&empty);
> +	if (ret == 0) {
> +		ret = !memcmp(&empty, set, sizeof(sigset_t));
> +	}
> +	return ret;
> +}
> +#endif

This is not a suitable fallback implementation. It's not needed on
musl (we provide sigisemptyset), but if this version were used, it
would give the wrong results, because musl's sigemptyset only fills
the first _NSIG-1 bits and ignores the remaining ~900 bits of junk in
sigset_t.

A valid fallback for sigisemptyset would be something like:

	int empty = 1, i;
	for (i=1; i<_NSIG; i++) {
		if (sigismember(set, i)>0) {
			empty = 0;
			break;
		}
	}

If _NSIG is unknown (not defined), sizeof(sigset_t)*8+1 could work in
its place, assuming signals are numbered sequentially.

Note that in the case of an invalid signal number, sigismember should
return either 0 (not a member) or -1 (with errno set); the above code
I suggested handles this case (for example, if you try signal numbers
greater than _NSIG that are not actually reflected in the sigset_t).

Rich


More information about the busybox mailing list