You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
252 lines
6.5 KiB
252 lines
6.5 KiB
From 83a379cfbd283b387919fe05d44eb4c49e155ad6 Mon Sep 17 00:00:00 2001 |
|
From: Lukasz Florczak <lukasz.florczak@linux.intel.com> |
|
Date: Mon, 21 Feb 2022 13:05:20 +0100 |
|
Subject: [PATCH 05/12] Replace error prone signal() with sigaction() |
|
|
|
Up to this date signal() was used which implementation could vary [1]. |
|
Sigaction() call is preferred. This commit introduces replacement |
|
from signal() to sigaction() by the use of signal_s() wrapper. |
|
Also remove redundant signal.h header includes. |
|
|
|
[1] https://man7.org/linux/man-pages/man2/signal.2.html |
|
|
|
Signed-off-by: Lukasz Florczak <lukasz.florczak@linux.intel.com> |
|
Signed-off-by: Jes Sorensen <jsorensen@fb.com> |
|
--- |
|
Grow.c | 4 ++-- |
|
Monitor.c | 5 +++-- |
|
managemon.c | 1 - |
|
mdadm.h | 22 ++++++++++++++++++++++ |
|
mdmon.c | 1 - |
|
monitor.c | 1 - |
|
probe_roms.c | 6 +++--- |
|
raid6check.c | 25 +++++++++++++++---------- |
|
util.c | 1 - |
|
9 files changed, 45 insertions(+), 21 deletions(-) |
|
|
|
diff --git a/Grow.c b/Grow.c |
|
index aa72490b..18c5719b 100644 |
|
--- a/Grow.c |
|
+++ b/Grow.c |
|
@@ -26,7 +26,6 @@ |
|
#include <sys/mman.h> |
|
#include <stddef.h> |
|
#include <stdint.h> |
|
-#include <signal.h> |
|
#include <sys/wait.h> |
|
|
|
#if ! defined(__BIG_ENDIAN) && ! defined(__LITTLE_ENDIAN) |
|
@@ -3566,7 +3565,8 @@ started: |
|
fd = -1; |
|
mlockall(MCL_FUTURE); |
|
|
|
- signal(SIGTERM, catch_term); |
|
+ if (signal_s(SIGTERM, catch_term) == SIG_ERR) |
|
+ goto release; |
|
|
|
if (st->ss->external) { |
|
/* metadata handler takes it from here */ |
|
diff --git a/Monitor.c b/Monitor.c |
|
index 30c031a2..c0ab5412 100644 |
|
--- a/Monitor.c |
|
+++ b/Monitor.c |
|
@@ -26,7 +26,6 @@ |
|
#include "md_p.h" |
|
#include "md_u.h" |
|
#include <sys/wait.h> |
|
-#include <signal.h> |
|
#include <limits.h> |
|
#include <syslog.h> |
|
#ifndef NO_LIBUDEV |
|
@@ -435,8 +434,10 @@ static void alert(char *event, char *dev, char *disc, struct alert_info *info) |
|
if (mp) { |
|
FILE *mdstat; |
|
char hname[256]; |
|
+ |
|
gethostname(hname, sizeof(hname)); |
|
- signal(SIGPIPE, SIG_IGN); |
|
+ signal_s(SIGPIPE, SIG_IGN); |
|
+ |
|
if (info->mailfrom) |
|
fprintf(mp, "From: %s\n", info->mailfrom); |
|
else |
|
diff --git a/managemon.c b/managemon.c |
|
index bb7334cf..0e9bdf00 100644 |
|
--- a/managemon.c |
|
+++ b/managemon.c |
|
@@ -106,7 +106,6 @@ |
|
#include "mdmon.h" |
|
#include <sys/syscall.h> |
|
#include <sys/socket.h> |
|
-#include <signal.h> |
|
|
|
static void close_aa(struct active_array *aa) |
|
{ |
|
diff --git a/mdadm.h b/mdadm.h |
|
index c7268a71..26e7e5cd 100644 |
|
--- a/mdadm.h |
|
+++ b/mdadm.h |
|
@@ -46,6 +46,7 @@ extern __off64_t lseek64 __P ((int __fd, __off64_t __offset, int __whence)); |
|
#include <string.h> |
|
#include <syslog.h> |
|
#include <stdbool.h> |
|
+#include <signal.h> |
|
/* Newer glibc requires sys/sysmacros.h directly for makedev() */ |
|
#include <sys/sysmacros.h> |
|
#ifdef __dietlibc__ |
|
@@ -1729,6 +1730,27 @@ static inline char *to_subarray(struct mdstat_ent *ent, char *container) |
|
return &ent->metadata_version[10+strlen(container)+1]; |
|
} |
|
|
|
+/** |
|
+ * signal_s() - Wrapper for sigaction() with signal()-like interface. |
|
+ * @sig: The signal to set the signal handler to. |
|
+ * @handler: The signal handler. |
|
+ * |
|
+ * Return: previous handler or SIG_ERR on failure. |
|
+ */ |
|
+static inline sighandler_t signal_s(int sig, sighandler_t handler) |
|
+{ |
|
+ struct sigaction new_act; |
|
+ struct sigaction old_act; |
|
+ |
|
+ new_act.sa_handler = handler; |
|
+ new_act.sa_flags = 0; |
|
+ |
|
+ if (sigaction(sig, &new_act, &old_act) == 0) |
|
+ return old_act.sa_handler; |
|
+ |
|
+ return SIG_ERR; |
|
+} |
|
+ |
|
#ifdef DEBUG |
|
#define dprintf(fmt, arg...) \ |
|
fprintf(stderr, "%s: %s: "fmt, Name, __func__, ##arg) |
|
diff --git a/mdmon.c b/mdmon.c |
|
index c71e62c6..5570574b 100644 |
|
--- a/mdmon.c |
|
+++ b/mdmon.c |
|
@@ -56,7 +56,6 @@ |
|
#include <errno.h> |
|
#include <string.h> |
|
#include <fcntl.h> |
|
-#include <signal.h> |
|
#include <dirent.h> |
|
#ifdef USE_PTHREADS |
|
#include <pthread.h> |
|
diff --git a/monitor.c b/monitor.c |
|
index e0d3be67..b877e595 100644 |
|
--- a/monitor.c |
|
+++ b/monitor.c |
|
@@ -22,7 +22,6 @@ |
|
#include "mdmon.h" |
|
#include <sys/syscall.h> |
|
#include <sys/select.h> |
|
-#include <signal.h> |
|
|
|
static char *array_states[] = { |
|
"clear", "inactive", "suspended", "readonly", "read-auto", |
|
diff --git a/probe_roms.c b/probe_roms.c |
|
index 7ea04c7a..94c80c2c 100644 |
|
--- a/probe_roms.c |
|
+++ b/probe_roms.c |
|
@@ -22,7 +22,6 @@ |
|
#include "probe_roms.h" |
|
#include "mdadm.h" |
|
#include <unistd.h> |
|
-#include <signal.h> |
|
#include <fcntl.h> |
|
#include <sys/mman.h> |
|
#include <sys/stat.h> |
|
@@ -69,7 +68,8 @@ static int probe_address16(const __u16 *ptr, __u16 *val) |
|
|
|
void probe_roms_exit(void) |
|
{ |
|
- signal(SIGBUS, SIG_DFL); |
|
+ signal_s(SIGBUS, SIG_DFL); |
|
+ |
|
if (rom_fd >= 0) { |
|
close(rom_fd); |
|
rom_fd = -1; |
|
@@ -98,7 +98,7 @@ int probe_roms_init(unsigned long align) |
|
if (roms_init()) |
|
return -1; |
|
|
|
- if (signal(SIGBUS, sigbus) == SIG_ERR) |
|
+ if (signal_s(SIGBUS, sigbus) == SIG_ERR) |
|
rc = -1; |
|
if (rc == 0) { |
|
fd = open("/dev/mem", O_RDONLY); |
|
diff --git a/raid6check.c b/raid6check.c |
|
index a8e6005b..99477761 100644 |
|
--- a/raid6check.c |
|
+++ b/raid6check.c |
|
@@ -24,7 +24,6 @@ |
|
|
|
#include "mdadm.h" |
|
#include <stdint.h> |
|
-#include <signal.h> |
|
#include <sys/mman.h> |
|
|
|
#define CHECK_PAGE_BITS (12) |
|
@@ -130,30 +129,36 @@ void raid6_stats(int *disk, int *results, int raid_disks, int chunk_size) |
|
} |
|
|
|
int lock_stripe(struct mdinfo *info, unsigned long long start, |
|
- int chunk_size, int data_disks, sighandler_t *sig) { |
|
+ int chunk_size, int data_disks, sighandler_t *sig) |
|
+{ |
|
int rv; |
|
+ |
|
+ sig[0] = signal_s(SIGTERM, SIG_IGN); |
|
+ sig[1] = signal_s(SIGINT, SIG_IGN); |
|
+ sig[2] = signal_s(SIGQUIT, SIG_IGN); |
|
+ |
|
+ if (sig[0] == SIG_ERR || sig[1] == SIG_ERR || sig[2] == SIG_ERR) |
|
+ return 1; |
|
+ |
|
if(mlockall(MCL_CURRENT | MCL_FUTURE) != 0) { |
|
return 2; |
|
} |
|
|
|
- sig[0] = signal(SIGTERM, SIG_IGN); |
|
- sig[1] = signal(SIGINT, SIG_IGN); |
|
- sig[2] = signal(SIGQUIT, SIG_IGN); |
|
- |
|
rv = sysfs_set_num(info, NULL, "suspend_lo", start * chunk_size * data_disks); |
|
rv |= sysfs_set_num(info, NULL, "suspend_hi", (start + 1) * chunk_size * data_disks); |
|
return rv * 256; |
|
} |
|
|
|
-int unlock_all_stripes(struct mdinfo *info, sighandler_t *sig) { |
|
+int unlock_all_stripes(struct mdinfo *info, sighandler_t *sig) |
|
+{ |
|
int rv; |
|
rv = sysfs_set_num(info, NULL, "suspend_lo", 0x7FFFFFFFFFFFFFFFULL); |
|
rv |= sysfs_set_num(info, NULL, "suspend_hi", 0); |
|
rv |= sysfs_set_num(info, NULL, "suspend_lo", 0); |
|
|
|
- signal(SIGQUIT, sig[2]); |
|
- signal(SIGINT, sig[1]); |
|
- signal(SIGTERM, sig[0]); |
|
+ signal_s(SIGQUIT, sig[2]); |
|
+ signal_s(SIGINT, sig[1]); |
|
+ signal_s(SIGTERM, sig[0]); |
|
|
|
if(munlockall() != 0) |
|
return 3; |
|
diff --git a/util.c b/util.c |
|
index 3d05d074..cc94f96e 100644 |
|
--- a/util.c |
|
+++ b/util.c |
|
@@ -35,7 +35,6 @@ |
|
#include <poll.h> |
|
#include <ctype.h> |
|
#include <dirent.h> |
|
-#include <signal.h> |
|
#include <dlfcn.h> |
|
|
|
|
|
-- |
|
2.31.1 |
|
|
|
|