1
0
mirror of git://sourceware.org/git/lvm2.git synced 2025-09-12 01:44:21 +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 - Version 1.02.136 -
====================================== ======================================
Check and report pthread_sigmask() failure in dmeventd.
Check mem alloc fail in _canonicalize_field_ids(). Check mem alloc fail in _canonicalize_field_ids().
Use unsigned math when checking more then 31 legs of raid. Use unsigned math when checking more then 31 legs of raid.
Fix 'dmstats delete' with dmsetup older than v1.02.129 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 #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 { enum {
DM_WAIT_RETRY, DM_WAIT_RETRY,
DM_WAIT_INTR, DM_WAIT_INTR,
@@ -849,7 +838,7 @@ enum {
/* Wait on a device until an event occurs. */ /* Wait on a device until an event occurs. */
static int _event_wait(struct thread_status *thread) static int _event_wait(struct thread_status *thread)
{ {
sigset_t set; sigset_t set, old;
int ret = DM_WAIT_RETRY; int ret = DM_WAIT_RETRY;
struct dm_info info; 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, * This is so that you can break out of waiting on an event,
* either for a timeout event, or to cancel the thread. * 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)) { if (dm_task_run(thread->wait_task)) {
thread->current_events |= DM_EVENT_DEVICE_ERROR; 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 #ifdef DEBUG_SIGNALS
_print_sigset("dmeventd blocking ", &set); _print_sigset("dmeventd blocking ", &old);
#endif #endif
DEBUGLOG("Completed waitevent task for %s.", thread->device.name); DEBUGLOG("Completed waitevent task for %s.", thread->device.name);