aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/openvpn/proxy.c5
-rw-r--r--src/openvpn/sig.c45
-rw-r--r--src/openvpn/socket.c8
-rw-r--r--src/openvpn/socks.c14
4 files changed, 44 insertions, 28 deletions
diff --git a/src/openvpn/proxy.c b/src/openvpn/proxy.c
index 91121f2..120ba85 100644
--- a/src/openvpn/proxy.c
+++ b/src/openvpn/proxy.c
@@ -1080,10 +1080,7 @@ done:
return ret;
error:
- if (!sig_info->signal_received)
- {
- register_signal(sig_info, SIGUSR1, "HTTP proxy error"); /* SOFT-SIGUSR1 -- HTTP proxy error */
- }
+ register_signal(sig_info, SIGUSR1, "HTTP proxy error"); /* SOFT-SIGUSR1 -- HTTP proxy error */
gc_free(&gc);
return ret;
}
diff --git a/src/openvpn/sig.c b/src/openvpn/sig.c
index e462b93..d6b18cb 100644
--- a/src/openvpn/sig.c
+++ b/src/openvpn/sig.c
@@ -47,16 +47,17 @@ struct signal_info siginfo_static; /* GLOBAL */
struct signame {
int value;
+ int priority;
const char *upper;
const char *lower;
};
static const struct signame signames[] = {
- { SIGINT, "SIGINT", "sigint"},
- { SIGTERM, "SIGTERM", "sigterm" },
- { SIGHUP, "SIGHUP", "sighup" },
- { SIGUSR1, "SIGUSR1", "sigusr1" },
- { SIGUSR2, "SIGUSR2", "sigusr2" }
+ { SIGINT, 5, "SIGINT", "sigint"},
+ { SIGTERM, 4, "SIGTERM", "sigterm" },
+ { SIGHUP, 3, "SIGHUP", "sighup" },
+ { SIGUSR1, 2, "SIGUSR1", "sigusr1" },
+ { SIGUSR2, 1, "SIGUSR2", "sigusr2" }
};
int
@@ -73,6 +74,19 @@ parse_signal(const char *signame)
return -1;
}
+static int
+signal_priority(int sig)
+{
+ for (size_t i = 0; i < SIZE(signames); ++i)
+ {
+ if (sig == signames[i].value)
+ {
+ return signames[i].priority;
+ }
+ }
+ return -1;
+}
+
const char *
signal_name(const int sig, const bool upper)
{
@@ -103,16 +117,22 @@ signal_description(const int signum, const char *sigtext)
void
throw_signal(const int signum)
{
- siginfo_static.signal_received = signum;
- siginfo_static.source = SIG_SOURCE_HARD;
+ if (signal_priority(signum) >= signal_priority(siginfo_static.signal_received))
+ {
+ siginfo_static.signal_received = signum;
+ siginfo_static.source = SIG_SOURCE_HARD;
+ }
}
void
throw_signal_soft(const int signum, const char *signal_text)
{
- siginfo_static.signal_received = signum;
- siginfo_static.source = SIG_SOURCE_SOFT;
- siginfo_static.signal_text = signal_text;
+ if (signal_priority(signum) >= signal_priority(siginfo_static.signal_received))
+ {
+ siginfo_static.signal_received = signum;
+ siginfo_static.source = SIG_SOURCE_SOFT;
+ siginfo_static.signal_text = signal_text;
+ }
}
void
@@ -472,9 +492,10 @@ process_signal(struct context *c)
void
register_signal(struct signal_info *si, int sig, const char *text)
{
- if (si->signal_received != SIGTERM)
+ if (signal_priority(sig) >= signal_priority(si->signal_received))
{
si->signal_received = sig;
+ si->signal_text = text;
+ si->source = SIG_SOURCE_SOFT;
}
- si->signal_text = text;
}
diff --git a/src/openvpn/socket.c b/src/openvpn/socket.c
index 77c5c2f..bb3be42 100644
--- a/src/openvpn/socket.c
+++ b/src/openvpn/socket.c
@@ -2277,8 +2277,12 @@ link_socket_init_phase2(struct context *c)
done:
if (sig_save.signal_received)
{
- /* This can potentially lose a saved high priority signal -- to be fixed */
- if (!sig_info->signal_received)
+ /* Always restore the saved signal -- register/throw_signal will handle priority */
+ if (sig_save.source == SIG_SOURCE_HARD && sig_info == &siginfo_static)
+ {
+ throw_signal(sig_save.signal_received);
+ }
+ else
{
register_signal(sig_info, sig_save.signal_received, sig_save.signal_text);
}
diff --git a/src/openvpn/socks.c b/src/openvpn/socks.c
index b2ca374..8f2ae22 100644
--- a/src/openvpn/socks.c
+++ b/src/openvpn/socks.c
@@ -499,11 +499,8 @@ establish_socks_proxy_passthru(struct socks_proxy_info *p,
return;
error:
- if (!sig_info->signal_received)
- {
- /* SOFT-SIGUSR1 -- socks error */
- register_signal(sig_info, SIGUSR1, "socks-error");
- }
+ /* SOFT-SIGUSR1 -- socks error */
+ register_signal(sig_info, SIGUSR1, "socks-error");
return;
}
@@ -543,11 +540,8 @@ establish_socks_proxy_udpassoc(struct socks_proxy_info *p,
return;
error:
- if (!sig_info->signal_received)
- {
- /* SOFT-SIGUSR1 -- socks error */
- register_signal(sig_info, SIGUSR1, "socks-error");
- }
+ /* SOFT-SIGUSR1 -- socks error */
+ register_signal(sig_info, SIGUSR1, "socks-error");
return;
}