signal: correct sigset() return value & errno
ref: https://man7.org/linux/man-pages/man3/sigset.3.html The dispositions for SIGKILL and SIGSTOP cannot be changed. Signed-off-by: ligd <liguiding1@xiaomi.com>
This commit is contained in:
parent
af2b491420
commit
eef619fc46
@ -26,6 +26,7 @@
|
|||||||
|
|
||||||
#include <signal.h>
|
#include <signal.h>
|
||||||
#include <assert.h>
|
#include <assert.h>
|
||||||
|
#include <errno.h>
|
||||||
|
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
* Public Functions
|
* Public Functions
|
||||||
@ -98,9 +99,14 @@ _sa_handler_t sigset(int signo, _sa_handler_t func)
|
|||||||
{
|
{
|
||||||
_sa_handler_t disposition;
|
_sa_handler_t disposition;
|
||||||
sigset_t set;
|
sigset_t set;
|
||||||
int ret;
|
int ret = -EINVAL;
|
||||||
|
|
||||||
DEBUGASSERT(GOOD_SIGNO(signo) && func != SIG_ERR);
|
if (signo == SIGKILL || signo == SIGSTOP || !GOOD_SIGNO(signo))
|
||||||
|
{
|
||||||
|
goto err;
|
||||||
|
}
|
||||||
|
|
||||||
|
DEBUGASSERT(func != SIG_ERR);
|
||||||
|
|
||||||
sigemptyset(&set);
|
sigemptyset(&set);
|
||||||
sigaddset(&set, signo);
|
sigaddset(&set, signo);
|
||||||
@ -110,7 +116,12 @@ _sa_handler_t sigset(int signo, _sa_handler_t func)
|
|||||||
if (func == SIG_HOLD)
|
if (func == SIG_HOLD)
|
||||||
{
|
{
|
||||||
ret = sigprocmask(SIG_BLOCK, &set, NULL);
|
ret = sigprocmask(SIG_BLOCK, &set, NULL);
|
||||||
disposition = ret < 0 ? SIG_ERR : SIG_HOLD;
|
if (ret < 0)
|
||||||
|
{
|
||||||
|
goto err;
|
||||||
|
}
|
||||||
|
|
||||||
|
disposition = SIG_HOLD;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* No.. then signal can handle the other cases */
|
/* No.. then signal can handle the other cases */
|
||||||
@ -132,10 +143,13 @@ _sa_handler_t sigset(int signo, _sa_handler_t func)
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
signal(signo, disposition);
|
signal(signo, disposition);
|
||||||
disposition = SIG_ERR;
|
goto err;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return disposition;
|
return disposition;
|
||||||
|
err:
|
||||||
|
set_errno(-ret);
|
||||||
|
return (_sa_handler_t)SIG_ERR;
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user