From f8a7584a13bd81a90da4d974f393ff53a0b6a827 Mon Sep 17 00:00:00 2001 From: Nate Choe Date: Wed, 1 Jun 2022 08:40:52 +0000 Subject: [PATCH] Properly handled signals --- Makefile | 2 +- site/sitefile | 2 +- src/main.c | 85 +++++++++++++++++++++++++----------------------- src/setup.c | 3 +- src/swebs/util.h | 1 + src/util.c | 19 +++++++++++ 6 files changed, 69 insertions(+), 43 deletions(-) diff --git a/Makefile b/Makefile index 57269eb..572a0a1 100644 --- a/Makefile +++ b/Makefile @@ -2,7 +2,7 @@ SRC = $(wildcard src/*.c) OBJ = $(subst .c,.o,$(subst src,work,$(SRC))) LIBS = gnutls LDFLAGS = -pie -lrt -ldl $(shell pkg-config --libs $(LIBS)) -CFLAGS := -O2 -pipe -Wall -Wpedantic -Wshadow -ansi +CFLAGS := -O2 -pipe -Wall -Wpedantic -Wshadow -ansi -D_XOPEN_SOURCE=500 CFLAGS += -Isrc/ -fpie -D_POSIX_C_SOURCE=200809L $(shell pkg-config --cflags $(LIBS)) INSTALLDIR := /usr/sbin HEADERDIR := /usr/include/ diff --git a/site/sitefile b/site/sitefile index d8d93b2..2380c2b 100644 --- a/site/sitefile +++ b/site/sitefile @@ -1,6 +1,6 @@ define port 8000 -#define transport TLS +define transport TLS define key domain.key define cert domain.crt define timeout 2000 diff --git a/src/main.c b/src/main.c index 6ad7699..1f68011 100644 --- a/src/main.c +++ b/src/main.c @@ -48,10 +48,42 @@ static Sitefile *site; static struct sockaddr_un addr; /* We want to be able to handle a signal at any time, so some global variables * are needed. */ +static const int signals[] = { + SIGPIPE, SIGHUP, SIGINT, SIGQUIT, SIGILL, SIGTRAP, SIGABRT, SIGBUS, SIGFPE, + SIGKILL, SIGSEGV, SIGTERM, SIGTTIN, SIGTTOU, SIGURG, SIGXCPU, SIGXFSZ, SIGPIPE, +}; + +static void exitClean(int signal) { + freeListener(listener); + close(mainfd); + remove(addr.sun_path); + exit(EXIT_SUCCESS); +} + +static void setsignal(int signal, void (*handler)(int)) { + struct sigaction action; + sigset_t sigset; + sigemptyset(&sigset); + action.sa_handler = handler; + action.sa_mask = sigset; + action.sa_flags = SA_NODEFER; + sigaction(signal, &action, NULL); +} + +static void unsetsignal(int signal) { + struct sigaction action; + sigset_t sigset; + sigemptyset(&sigset); + action.sa_handler = SIG_DFL; + action.sa_mask = sigset; + action.sa_flags = SA_NODEFER; + sigaction(signal, &action, NULL); +} static void createProcess(int id) { pid_t pid; int connfd; + int i; socklen_t addrlen; createLog("Creating a new process"); @@ -60,7 +92,7 @@ static void createProcess(int id) { pid = fork(); switch (pid) { case -1: - createLog("fork() failed"); + createErrorLog("fork() failed", errno); exit(EXIT_FAILURE); case 0: break; @@ -72,11 +104,15 @@ static void createProcess(int id) { return; } + for (i = 0; i < sizeof(signals) / sizeof(signals[0]); i++) + unsetsignal(signals[i]); + unsetsignal(SIGCHLD); + connfd = socket(AF_UNIX, SOCK_STREAM, 0); if (connfd < 0) exit(EXIT_FAILURE); if (connect(connfd, (struct sockaddr *) &addr, sizeof(addr))) { - createLog("connect() failed, killing child"); + createErrorLog("connect() failed, killing child", errno); exit(EXIT_FAILURE); } close(mainfd); @@ -99,23 +135,6 @@ static void remakeChild(int signal) { } } -static void exitClean(int signal) { - freeListener(listener); - close(mainfd); - remove(addr.sun_path); - exit(EXIT_SUCCESS); -} - -static void setsignal(int signal, void (*handler)(int)) { - struct sigaction action; - sigset_t sigset; - sigemptyset(&sigset); - action.sa_handler = handler; - action.sa_mask = sigset; - action.sa_flags = SA_NODEFER; - sigaction(signal, &action, NULL); -} - int main(int argc, char **argv) { int i; int pendingid; @@ -124,12 +143,12 @@ int main(int argc, char **argv) { pendingid = smalloc(sizeof(int) * (processes - 1)); if (pendingid < 0) { - createLog("smalloc() failed"); + createErrorLog("smalloc() failed", errno); exit(EXIT_FAILURE); } pending = saddr(pendingid); if (pending == NULL) { - createLog("saddr() failed"); + createErrorLog("saddr() failed", errno); exit(EXIT_FAILURE); } memset(pending, 0, sizeof(int) * (processes - 1)); @@ -148,24 +167,9 @@ int main(int argc, char **argv) { for (i = 0; i < processes - 1; i++) createProcess(i); - setsignal(SIGPIPE, SIG_IGN); - setsignal(SIGHUP, exitClean); - setsignal(SIGINT, exitClean); - setsignal(SIGQUIT, exitClean); - setsignal(SIGILL, exitClean); - setsignal(SIGTRAP, exitClean); - setsignal(SIGABRT, exitClean); - setsignal(SIGBUS, exitClean); - setsignal(SIGFPE, exitClean); - setsignal(SIGKILL, exitClean); - setsignal(SIGSEGV, exitClean); - setsignal(SIGTERM, exitClean); - setsignal(SIGTTIN, exitClean); - setsignal(SIGTTOU, exitClean); - setsignal(SIGURG, exitClean); - setsignal(SIGXCPU, exitClean); - setsignal(SIGXFSZ, exitClean); - setsignal(SIGPIPE, exitClean); + for (i = 0; i < sizeof(signals) / sizeof(signals[0]); i++) + setsignal(signals[i], exitClean); + setsignal(SIGCHLD, remakeChild); createLog("swebs started"); @@ -178,7 +182,8 @@ int main(int argc, char **argv) { if (fd < 0) { if (errno == ENOTSOCK || errno == EOPNOTSUPP || errno == EINVAL) { - createLog("You've majorly screwed up"); + createErrorLog("You've majorly screwed up. Good luck", + errno); exit(EXIT_FAILURE); } continue; diff --git a/src/setup.c b/src/setup.c index 062529a..a7f76bd 100644 --- a/src/setup.c +++ b/src/setup.c @@ -20,6 +20,7 @@ #include #include +#include #include #include @@ -160,7 +161,7 @@ NULL createLog("Couldn't find swebs user"); else if (seteuid(swebs->pw_uid)) - createLog("seteuid() failed"); + createErrorLog("seteuid() failed", errno); root = getpwnam("root"); if (root == NULL) { createLog("Couldn't find root user, quitting"); diff --git a/src/swebs/util.h b/src/swebs/util.h index 20335be..2cc2267 100644 --- a/src/swebs/util.h +++ b/src/swebs/util.h @@ -29,6 +29,7 @@ void sfree(void *addr); void sdestroy(int id); int createLog(char *msg); +int createErrorLog(char *msg, int err); int istrcmp(char *s1, char *s2); /* case insensitive strcmp */ RequestType getType(char *str); diff --git a/src/util.c b/src/util.c index 1e93e85..edc203e 100644 --- a/src/util.c +++ b/src/util.c @@ -76,6 +76,25 @@ int createLog(char *msg) { return 0; } +int createErrorLog(char *msg, int err) { + time_t currenttime; + struct tm *timeinfo; + time(¤ttime); + timeinfo = gmtime(¤ttime); + if (timeinfo == NULL) + return 1; + fprintf(logs, "[%d-%02d-%02dT%02d:%02d:%02dZ] %s: %s\n", + timeinfo->tm_year + 1900, + timeinfo->tm_mon + 1, + timeinfo->tm_mday, + timeinfo->tm_hour, + timeinfo->tm_min, + timeinfo->tm_sec, + msg, strerror(err)); + fflush(logs); + return 0; +} + int istrcmp(char *s1, char *s2) { int i; for (i = 0;; i++) {