[PATCH] Catch errors with sigaddset(3) in sigaddset (sighold)

Kostik Belousov kostikbel at gmail.com
Mon Jul 19 12:09:21 UTC 2010


On Sun, Jul 18, 2010 at 10:46:25PM -0700, Garrett Cooper wrote:
>     sighold(3) doesn't determine whether or not the signal added is
> valid today (and sigprocmask doesn't verify that either). This fixes
> that.
> Thanks,
> -Garrett
> 
> Index: sigcompat.c
> ===================================================================
> --- sigcompat.c	(revision 210226)
> +++ sigcompat.c	(working copy)
> @@ -131,7 +131,8 @@
>  	sigset_t set;
> 
>  	sigemptyset(&set);
> -	sigaddset(&set, sig);
> +	if (sigaddset(&set, sig) == -1)
> +		return (-1);
>  	return (_sigprocmask(SIG_BLOCK, &set, NULL));
>  }

I added checks for failures of sig{add,del}set to the sigcompat.c,
and unified style to not assign intermediate error to local variable.

This is what I am going to commit shortly.

diff --git a/lib/libc/compat-43/sigcompat.c b/lib/libc/compat-43/sigcompat.c
index 6841eeb..199846f 100644
--- a/lib/libc/compat-43/sigcompat.c
+++ b/lib/libc/compat-43/sigcompat.c
@@ -112,16 +112,11 @@ int
 xsi_sigpause(int sig)
 {
 	sigset_t set;
-	int error;
 
-	if (!_SIG_VALID(sig)) {
-		errno = EINVAL;
+	if (_sigprocmask(SIG_BLOCK, NULL, &set) == -1)
+		return (-1);
+	if (sigdelset(&set, sig) == -1)
 		return (-1);
-	}
-	error = _sigprocmask(SIG_BLOCK, NULL, &set);
-	if (error != 0)
-		return (error);
-	sigdelset(&set, sig);
 	return (_sigsuspend(&set));
 }
 
@@ -131,7 +126,8 @@ sighold(int sig)
 	sigset_t set;
 
 	sigemptyset(&set);
-	sigaddset(&set, sig);
+	if (sigaddset(&set, sig) == -1)
+		return (-1);
 	return (_sigprocmask(SIG_BLOCK, &set, NULL));
 }
 
@@ -151,7 +147,8 @@ sigrelse(int sig)
 	sigset_t set;
 
 	sigemptyset(&set);
-	sigaddset(&set, sig);
+	if (sigaddset(&set, sig) == -1)
+		return (-1);
 	return (_sigprocmask(SIG_UNBLOCK, &set, NULL));
 }
 
@@ -160,35 +157,30 @@ void
 {
 	sigset_t set, pset;
 	struct sigaction sa, psa;
-	int error;
 
 	sigemptyset(&set);
-	sigaddset(&set, sig);
-	error = _sigprocmask(SIG_BLOCK, NULL, &pset);
-	if (error == -1)
+	if (sigaddset(&set, sig) == -1)
+		return (SIG_ERR);
+	if (_sigprocmask(SIG_BLOCK, NULL, &pset) == -1)
 		return (SIG_ERR);
 	if ((__sighandler_t *)disp == SIG_HOLD) {
-		error = _sigprocmask(SIG_BLOCK, &set, &pset);
-		if (error == -1)
+		if (_sigprocmask(SIG_BLOCK, &set, &pset) == -1)
 			return (SIG_ERR);
 		if (sigismember(&pset, sig))
 			return (SIG_HOLD);
 		else {
-			error = _sigaction(sig, NULL, &psa);
-			if (error == -1)
+			if (_sigaction(sig, NULL, &psa) == -1)
 				return (SIG_ERR);
 			return (psa.sa_handler);
 		}
 	} else {
-		error = _sigprocmask(SIG_UNBLOCK, &set, &pset);
-		if (error == -1)
+		if (_sigprocmask(SIG_UNBLOCK, &set, &pset) == -1)
 			return (SIG_ERR);
 	}
 
 	bzero(&sa, sizeof(sa));
 	sa.sa_handler = disp;
-	error = _sigaction(sig, &sa, &psa);
-	if (error == -1)
+	if (_sigaction(sig, &sa, &psa) == -1)
 		return (SIG_ERR);
 	if (sigismember(&pset, sig))
 		return (SIG_HOLD);
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 196 bytes
Desc: not available
Url : http://lists.freebsd.org/pipermail/freebsd-hackers/attachments/20100719/15aa9e2f/attachment.pgp


More information about the freebsd-hackers mailing list