sudo_sig2str(int signo, char *signame)
{
#if defined(SIGRTMIN) && defined(SIGRTMAX)
- /* Realtime signal support as per Solaris. */
+ /* Realtime signal support. */
if (signo >= SIGRTMIN && signo <= SIGRTMAX) {
- (void)snprintf(signame, SIG2STR_MAX, "RTMIN+%d", (signo - SIGRTMIN));
+ const long rtmax = sysconf(_SC_RTSIG_MAX);
+ if (rtmax > 0) {
+ if (signo == SIGRTMIN) {
+ strlcpy(signame, "RTMIN", SIG2STR_MAX);
+ } else if (signo == SIGRTMAX) {
+ strlcpy(signame, "RTMAX", SIG2STR_MAX);
+ } else if (signo <= SIGRTMIN + (rtmax / 2) - 1) {
+ (void)snprintf(signame, SIG2STR_MAX, "RTMIN+%d",
+ (signo - SIGRTMIN));
+ } else {
+ (void)snprintf(signame, SIG2STR_MAX, "RTMAX-%d",
+ (SIGRTMAX - signo));
+ }
+ }
return 0;
}
#endif
#ifdef HAVE_STRINGS_H
# include <strings.h>
#endif /* HAVE_STRINGS_H */
-#include <signal.h>
#include <ctype.h>
+#include <signal.h>
+#include <unistd.h>
#include "sudo_compat.h"
return 0;
}
if (signame[5] == '+') {
- if (signame[6] == '1' || signame[6] == '2' || signame[6] == '3') {
- *result = SIGRTMIN + (signame[6] - '0');
- return 0;
+ if (isdigit((unsigned char)signame[6])) {
+ const long rtmax = sysconf(_SC_RTSIG_MAX);
+ const int off = signame[6] - '0';
+
+ if (rtmax > 0 && off < rtmax / 2) {
+ *result = SIGRTMIN + off;
+ return 0;
+ }
}
}
}
return 0;
}
if (signame[5] == '-') {
- if (signame[6] == '1' || signame[6] == '2' || signame[6] == '3') {
- *result = SIGRTMAX - (signame[6] - '0');
- return 0;
+ if (isdigit((unsigned char)signame[6])) {
+ const long rtmax = sysconf(_SC_RTSIG_MAX);
+ const int off = signame[6] - '0';
+
+ if (rtmax > 0 && off < rtmax / 2) {
+ *result = SIGRTMAX - off;
+ return 0;
+ }
}
}
}
break;
}
- for (signo = 0; signo < NSIG; signo++) {
- if (strcmp(signame, sudo_sys_signame[signo]) == 0) {
- *result = signo;
- return 0;
+ for (signo = 1; signo < NSIG; signo++) {
+ if (sudo_sys_signame[signo] != NULL) {
+ if (strcmp(signame, sudo_sys_signame[signo]) == 0) {
+ *result = signo;
+ return 0;
+ }
}
}