summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJakob Kaivo <jkk@ung.org>2024-01-30 13:36:41 -0500
committerJakob Kaivo <jkk@ung.org>2024-01-30 13:36:41 -0500
commitf4f929b02eaed8ef8b798780ee5640bdd6809867 (patch)
tree2a3b559ed1184b3a585201f820ffc7a249fe0d05
parent635f3167091b5f7419cef9b24810f24269f40a37 (diff)
update standard and safety checks
-rw-r--r--src/signal/__signal.c5
-rw-r--r--src/signal/__signal_handler.c9
-rw-r--r--src/signal/bsd_signal.c26
-rw-r--r--src/signal/kill.c1
-rw-r--r--src/signal/killpg.c15
-rw-r--r--src/signal/raise.c3
-rw-r--r--src/signal/sigaction.c2
-rw-r--r--src/signal/sigaddset.c21
-rw-r--r--src/signal/sigaltstack.c15
-rw-r--r--src/signal/sigdelset.c21
-rw-r--r--src/signal/sigemptyset.c17
-rw-r--r--src/signal/sigfillset.c18
-rw-r--r--src/signal/sighold.c15
-rw-r--r--src/signal/sigignore.c18
-rw-r--r--src/signal/siginterrupt.c25
-rw-r--r--src/signal/sigismember.c23
-rw-r--r--src/signal/sigmask.c14
-rw-r--r--src/signal/signal.c6
-rw-r--r--src/signal/sigpause.c15
-rw-r--r--src/signal/sigpending.c16
-rw-r--r--src/signal/sigprocmask.c16
-rw-r--r--src/signal/sigqueue.c15
-rw-r--r--src/signal/sigrelse.c15
-rw-r--r--src/signal/sigset.c15
-rw-r--r--src/signal/sigstack.c15
-rw-r--r--src/signal/sigsuspend.c16
-rw-r--r--src/signal/sigtimedwait.c15
-rw-r--r--src/signal/sigwaitinfo.c15
28 files changed, 20 insertions, 387 deletions
diff --git a/src/signal/__signal.c b/src/signal/__signal.c
index 1c212bd1..e8c37e58 100644
--- a/src/signal/__signal.c
+++ b/src/signal/__signal.c
@@ -1,3 +1,8 @@
#include "_signal.h"
struct __signal __signal = {0};
+
+/*
+STDC(0)
+SIGNAL_SAFE(0)
+*/
diff --git a/src/signal/__signal_handler.c b/src/signal/__signal_handler.c
index fc0cc45f..985fa393 100644
--- a/src/signal/__signal_handler.c
+++ b/src/signal/__signal_handler.c
@@ -1,7 +1,6 @@
#include <stddef.h>
#include "_signal.h"
-
-#include <stdio.h>
+#include "_safety.h"
void __signal_handler(int sig)
{
@@ -9,5 +8,11 @@ void __signal_handler(int sig)
if (__signal.handlers[sig] != NULL) {
__signal.handlers[sig](sig);
}
+ /* TODO: if signal is fatal, trigger UB */
__signal.current = 0;
}
+
+/*
+STDC(0)
+SIGNAL_SAFE(0)
+*/
diff --git a/src/signal/bsd_signal.c b/src/signal/bsd_signal.c
deleted file mode 100644
index 7f87b4e1..00000000
--- a/src/signal/bsd_signal.c
+++ /dev/null
@@ -1,26 +0,0 @@
-#if 0
-
-#include <signal.h>
-
-void (*bsd_signal(int sig, void (*func)(int)))(int)
-{
- struct sigaction act, oact;
- act.sa_handler = func;
- act.sa_flags = SA_RESTART;
-
- sigemptyset(&act.sa_mask);
- sigaddset(&act.sa_mask, sig);
-
- if (sigaction(sig, &act, &oact) == -1) {
- return SIG_ERR;
- }
-
- return oact.sa_handler;
-}
-
-/*
-XOPEN(400,700)
-*/
-
-
-#endif
diff --git a/src/signal/kill.c b/src/signal/kill.c
index 3be1b3ad..877268f9 100644
--- a/src/signal/kill.c
+++ b/src/signal/kill.c
@@ -6,6 +6,7 @@
int kill(pid_t pid, int sig)
{
+ SIGNAL_SAFE(0);
SYSCALL(kill, int, -1, pid, sig, 0, 0, 0, 0);
}
/*
diff --git a/src/signal/killpg.c b/src/signal/killpg.c
deleted file mode 100644
index fdfee360..00000000
--- a/src/signal/killpg.c
+++ /dev/null
@@ -1,15 +0,0 @@
-#if 0
-
-#include <signal.h>
-
-int killpg(pid_t pgrp, int sig)
-{
- return 0;
-}
-
-/*
-XOPEN(400)
-*/
-
-
-#endif
diff --git a/src/signal/raise.c b/src/signal/raise.c
index 56bf3209..c4fd9649 100644
--- a/src/signal/raise.c
+++ b/src/signal/raise.c
@@ -13,10 +13,13 @@
#define getpid() __scall0(getpid)
#endif
+#include "_safety.h"
+
/** send a signal to the current program **/
int raise(int sig)
{
+ SIGNAL_SAFE(0);
/*
RETURN_FAILURE(NONZERO);
RETURN_SUCCESS(0);
diff --git a/src/signal/sigaction.c b/src/signal/sigaction.c
index 054f3958..f95301e9 100644
--- a/src/signal/sigaction.c
+++ b/src/signal/sigaction.c
@@ -7,6 +7,8 @@
int sigaction(int sig, const struct sigaction * restrict act, struct sigaction * restrict oact)
{
+ SIGNAL_SAFE(-1);
+
struct linux_action {
union {
void (*handler)(int);
diff --git a/src/signal/sigaddset.c b/src/signal/sigaddset.c
deleted file mode 100644
index 217b91fe..00000000
--- a/src/signal/sigaddset.c
+++ /dev/null
@@ -1,21 +0,0 @@
-#if 0
-
-#include <sys/types.h>
-#include <signal.h>
-#include <limits.h>
-
-int sigaddset(sigset_t * set, int signo)
-{
- /* TODO: fail with EINVAL if signo is not a valid signal number */
- size_t byte = signo % CHAR_BIT;
- int bit = signo / CHAR_BIT;
-
- set->__bits[byte] |= (1 << bit);
- return 0;
-}
-/*
-POSIX(1)
-*/
-
-
-#endif
diff --git a/src/signal/sigaltstack.c b/src/signal/sigaltstack.c
deleted file mode 100644
index 73ab2980..00000000
--- a/src/signal/sigaltstack.c
+++ /dev/null
@@ -1,15 +0,0 @@
-#if 0
-
-#include <signal.h>
-
-int sigaltstack(const stack_t * restrict ss, stack_t * restrict oss)
-{
- return 0;
-}
-
-/*
-XOPEN(400)
-*/
-
-
-#endif
diff --git a/src/signal/sigdelset.c b/src/signal/sigdelset.c
deleted file mode 100644
index 91db033e..00000000
--- a/src/signal/sigdelset.c
+++ /dev/null
@@ -1,21 +0,0 @@
-#if 0
-
-#include <sys/types.h>
-#include <signal.h>
-#include <limits.h>
-
-int sigdelset(sigset_t * set, int signo)
-{
- /* TODO: fail with EINVAL if signo is not a valid signal number */
- size_t byte = signo % CHAR_BIT;
- int bit = signo / CHAR_BIT;
-
- set->__bits[byte] ^= (1 << bit);
- return 0;
-}
-/*
-POSIX(1)
-*/
-
-
-#endif
diff --git a/src/signal/sigemptyset.c b/src/signal/sigemptyset.c
deleted file mode 100644
index 860668e7..00000000
--- a/src/signal/sigemptyset.c
+++ /dev/null
@@ -1,17 +0,0 @@
-#if 0
-
-#include <sys/types.h>
-#include <signal.h>
-#include <string.h>
-
-int sigemptyset(sigset_t * set)
-{
- memset(set, 0, sizeof(*set));
- return 0;
-}
-/*
-POSIX(1)
-*/
-
-
-#endif
diff --git a/src/signal/sigfillset.c b/src/signal/sigfillset.c
deleted file mode 100644
index 45acfd61..00000000
--- a/src/signal/sigfillset.c
+++ /dev/null
@@ -1,18 +0,0 @@
-#if 0
-
-#include <sys/types.h>
-#include <signal.h>
-#include <string.h>
-#include <limits.h>
-
-int sigfillset(sigset_t * set)
-{
- memset(set, UCHAR_MAX, sizeof(*set));
- return 0;
-}
-/*
-POSIX(1)
-*/
-
-
-#endif
diff --git a/src/signal/sighold.c b/src/signal/sighold.c
deleted file mode 100644
index 037761f4..00000000
--- a/src/signal/sighold.c
+++ /dev/null
@@ -1,15 +0,0 @@
-#if 0
-
-#include <signal.h>
-
-int sighold(int sig)
-{
- return 0;
-}
-
-/*
-XOPEN(400)
-*/
-
-
-#endif
diff --git a/src/signal/sigignore.c b/src/signal/sigignore.c
deleted file mode 100644
index aef76f50..00000000
--- a/src/signal/sigignore.c
+++ /dev/null
@@ -1,18 +0,0 @@
-#if 0
-
-#include <signal.h>
-
-int sigignore(int sig)
-{
- if (signal(sig, SIG_IGN) == SIG_ERR) {
- return -1;
- }
- return 0;
-}
-
-/*
-XOPEN(400)
-*/
-
-
-#endif
diff --git a/src/signal/siginterrupt.c b/src/signal/siginterrupt.c
deleted file mode 100644
index d3fc9ddd..00000000
--- a/src/signal/siginterrupt.c
+++ /dev/null
@@ -1,25 +0,0 @@
-#if 0
-
-#include <sys/types.h>
-#include <signal.h>
-
-int siginterrupt(int sig, int flag)
-{
- struct sigaction sa = { 0 };
- int ret = -1;
-
- sigaction(sig, NULL, &sa);
- if (flag) {
- sa.sa_flags &= ~SA_RESTART;
- } else {
- sa.sa_flags |= SA_RESTART;
- }
- return sigaction(sig, &sa, NULL);
-}
-
-/*
-XOPEN(400)
-*/
-
-
-#endif
diff --git a/src/signal/sigismember.c b/src/signal/sigismember.c
deleted file mode 100644
index b6347ddd..00000000
--- a/src/signal/sigismember.c
+++ /dev/null
@@ -1,23 +0,0 @@
-#if 0
-
-#include <sys/types.h>
-#include <signal.h>
-#include <limits.h>
-
-int sigismember(const sigset_t * set, int signo)
-{
- /* TODO: fail with EINVAL if signo is not a valid signal number */
-
- size_t byte = signo % CHAR_BIT;
- int bit = signo / CHAR_BIT;
- if (set->__bits[byte] & (1 << bit)) {
- return 1;
- }
- return 0;
-}
-/*
-POSIX(1)
-*/
-
-
-#endif
diff --git a/src/signal/sigmask.c b/src/signal/sigmask.c
deleted file mode 100644
index 616222ca..00000000
--- a/src/signal/sigmask.c
+++ /dev/null
@@ -1,14 +0,0 @@
-#if 0
-
-#include <signal.h>
-
-int sigmask(int signum)
-{
-}
-
-/*
-XOPEN(400,500)
-*/
-
-
-#endif
diff --git a/src/signal/signal.c b/src/signal/signal.c
index 03913053..b328a19a 100644
--- a/src/signal/signal.c
+++ b/src/signal/signal.c
@@ -21,10 +21,8 @@
void (*signal(int sig, void (*func)(int)))(int)
{
- if (__signal.current != 0 && __signal.current != sig) {
- /* only safe if resetting the current signal handler */
- SIGNAL_SAFE(0);
- }
+ /* signal safe iff we are resetting the current signal handler */
+ SIGNAL_SAFE((__signal.current == sig));
if (sig < 0 || sig > NSIGNALS) {
/* FIXME: should errno be set? */
diff --git a/src/signal/sigpause.c b/src/signal/sigpause.c
deleted file mode 100644
index 0cfdf3fb..00000000
--- a/src/signal/sigpause.c
+++ /dev/null
@@ -1,15 +0,0 @@
-#if 0
-
-#include <signal.h>
-
-int sigpause(int sig)
-{
- return 0;
-}
-
-/*
-XOPEN(400)
-*/
-
-
-#endif
diff --git a/src/signal/sigpending.c b/src/signal/sigpending.c
deleted file mode 100644
index 163d9519..00000000
--- a/src/signal/sigpending.c
+++ /dev/null
@@ -1,16 +0,0 @@
-#if 0
-
-#include <sys/types.h>
-#include <signal.h>
-#include "_syscall.h"
-
-int sigpending(sigset_t * set)
-{
- SYSCALL(sigpending, int, -1, set, sizeof(*set), 0, 0, 0, 0);
-}
-/*
-POSIX(1)
-*/
-
-
-#endif
diff --git a/src/signal/sigprocmask.c b/src/signal/sigprocmask.c
deleted file mode 100644
index 0df41963..00000000
--- a/src/signal/sigprocmask.c
+++ /dev/null
@@ -1,16 +0,0 @@
-#if 0
-
-#include <sys/types.h>
-#include <signal.h>
-#include "_syscall.h"
-
-int sigprocmask(int how, const sigset_t * restrict set, sigset_t * restrict oset)
-{
- SYSCALL(sigprocmask, int, -1, how, set, oset, sizeof(*set), 0, 0);
-}
-/*
-POSIX(1)
-*/
-
-
-#endif
diff --git a/src/signal/sigqueue.c b/src/signal/sigqueue.c
deleted file mode 100644
index 75fb44dc..00000000
--- a/src/signal/sigqueue.c
+++ /dev/null
@@ -1,15 +0,0 @@
-#if 0
-
-#include <signal.h>
-
-int sigqueue(pid_t pid, int signo, const union sigval value)
-{
- return 0;
-}
-
-/*
-POSIX(199309)
-*/
-
-
-#endif
diff --git a/src/signal/sigrelse.c b/src/signal/sigrelse.c
deleted file mode 100644
index 94418751..00000000
--- a/src/signal/sigrelse.c
+++ /dev/null
@@ -1,15 +0,0 @@
-#if 0
-
-#include <signal.h>
-
-int sigrelse(int sig)
-{
- return 0;
-}
-
-/*
-XOPEN(400)
-*/
-
-
-#endif
diff --git a/src/signal/sigset.c b/src/signal/sigset.c
deleted file mode 100644
index 72987408..00000000
--- a/src/signal/sigset.c
+++ /dev/null
@@ -1,15 +0,0 @@
-#if 0
-
-#include <signal.h>
-
-void (*sigset(int sig, void (*disp)(int)))(int)
-{
- return ((void*)(int)0);
-}
-
-/*
-XOPEN(400)
-*/
-
-
-#endif
diff --git a/src/signal/sigstack.c b/src/signal/sigstack.c
deleted file mode 100644
index d9ebb92c..00000000
--- a/src/signal/sigstack.c
+++ /dev/null
@@ -1,15 +0,0 @@
-#if 0
-
-#include <signal.h>
-
-int sigstack(struct sigstack *ss, struct sigstack *oss)
-{
- return 0;
-}
-
-/*
-XOPEN(400,600)
-*/
-
-
-#endif
diff --git a/src/signal/sigsuspend.c b/src/signal/sigsuspend.c
deleted file mode 100644
index 4ebe0346..00000000
--- a/src/signal/sigsuspend.c
+++ /dev/null
@@ -1,16 +0,0 @@
-#if 0
-
-#include <sys/types.h>
-#include <signal.h>
-#include "_syscall.h"
-
-int sigsuspend(const sigset_t * sigmask)
-{
- SYSCALL(sigsuspend, int, -1, sigmask, sizeof(*sigmask), 0, 0, 0, 0);
-}
-/*
-POSIX(1)
-*/
-
-
-#endif
diff --git a/src/signal/sigtimedwait.c b/src/signal/sigtimedwait.c
deleted file mode 100644
index 574f850d..00000000
--- a/src/signal/sigtimedwait.c
+++ /dev/null
@@ -1,15 +0,0 @@
-#if 0
-
-#include <signal.h>
-
-int sigtimedwait(const sigset_t * restrict set, siginfo_t * restrict info, const struct timespec * restrict timeout)
-{
- return 0;
-}
-
-/*
-POSIX(199309)
-*/
-
-
-#endif
diff --git a/src/signal/sigwaitinfo.c b/src/signal/sigwaitinfo.c
deleted file mode 100644
index de0976cf..00000000
--- a/src/signal/sigwaitinfo.c
+++ /dev/null
@@ -1,15 +0,0 @@
-#if 0
-
-#include <signal.h>
-
-int sigwaitinfo(const sigset_t * restrict set, siginfo_t * restrict info)
-{
- return 0;
-}
-
-/*
-POSIX(199309)
-*/
-
-
-#endif