[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