1
0
mirror of git://sourceware.org/git/lvm2.git synced 2024-10-27 01:55:10 +03:00

dmeventd: pthread_sigmask in single function

Integrate back _unblock_sigalrm() and check for error code of
pthread_sigmask() function so we do not use uninitialized
sigmask_t on error path (Coverity).
This commit is contained in:
Zdenek Kabelac 2016-10-03 15:39:54 +02:00
parent d70f112762
commit 00f883a4aa
2 changed files with 11 additions and 15 deletions

View File

@ -1,5 +1,6 @@
Version 1.02.136 -
======================================
Check and report pthread_sigmask() failure in dmeventd.
Check mem alloc fail in _canonicalize_field_ids().
Use unsigned math when checking more then 31 legs of raid.
Fix 'dmstats delete' with dmsetup older than v1.02.129

View File

@ -829,17 +829,6 @@ static void _print_sigset(const char *prefix, const sigset_t *sigset)
}
#endif
static sigset_t _unblock_sigalrm(void)
{
sigset_t set, old;
sigemptyset(&set);
sigaddset(&set, SIGALRM);
pthread_sigmask(SIG_UNBLOCK, &set, &old);
return old;
}
enum {
DM_WAIT_RETRY,
DM_WAIT_INTR,
@ -849,7 +838,7 @@ enum {
/* Wait on a device until an event occurs. */
static int _event_wait(struct thread_status *thread)
{
sigset_t set;
sigset_t set, old;
int ret = DM_WAIT_RETRY;
struct dm_info info;
@ -859,7 +848,12 @@ static int _event_wait(struct thread_status *thread)
* This is so that you can break out of waiting on an event,
* either for a timeout event, or to cancel the thread.
*/
set = _unblock_sigalrm();
sigemptyset(&set);
sigaddset(&set, SIGALRM);
if (pthread_sigmask(SIG_UNBLOCK, &set, &old) != 0) {
log_sys_error("pthread_sigmask", "unblock alarm");
return ret; /* What better */
}
if (dm_task_run(thread->wait_task)) {
thread->current_events |= DM_EVENT_DEVICE_ERROR;
@ -883,10 +877,11 @@ static int _event_wait(struct thread_status *thread)
}
}
pthread_sigmask(SIG_SETMASK, &set, NULL);
if (pthread_sigmask(SIG_SETMASK, &old, NULL) != 0)
log_sys_error("pthread_sigmask", "block alarm");
#ifdef DEBUG_SIGNALS
_print_sigset("dmeventd blocking ", &set);
_print_sigset("dmeventd blocking ", &old);
#endif
DEBUGLOG("Completed waitevent task for %s.", thread->device.name);