Improved signal handling, removed tmpnam()

This commit is contained in:
Nate Choe
2022-04-05 11:59:14 -05:00
parent 00bbd9c1d4
commit 8914e57eec
5 changed files with 64 additions and 8 deletions

View File

@@ -113,7 +113,7 @@ static void setsignal(int signal, void (*handler)(int)) {
action.sa_handler = handler;
action.sa_mask = sigset;
action.sa_flags = SA_NODEFER;
sigaction(SIGCHLD, &action, NULL);
sigaction(signal, &action, NULL);
}
int main(int argc, char **argv) {
@@ -136,10 +136,11 @@ int main(int argc, char **argv) {
mainfd = socket(AF_UNIX, SOCK_STREAM, 0);
addr.sun_family = AF_UNIX;
strncpy(addr.sun_path, tmpnam(NULL), sizeof(addr.sun_path) - 1);
/* I know that tmpname is deprecated, I think this usage is safe
* though. */
strncpy(addr.sun_path, SERVER_PATH, sizeof(addr.sun_path) - 1);
addr.sun_path[sizeof(addr.sun_path) - 1] = '\0';
createTmpName(addr.sun_path);
bind(mainfd, (struct sockaddr *) &addr, sizeof(addr));
listen(mainfd, processes);
@@ -148,8 +149,23 @@ int main(int argc, char **argv) {
createProcess(i);
setsignal(SIGPIPE, SIG_IGN);
setsignal(SIGKILL, exitClean);
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);
setsignal(SIGCHLD, remakeChild);
createLog("swebs started");

View File

@@ -31,9 +31,6 @@
#include <swebs/responses.h>
#include <swebs/responseutil.h>
char *realpath(char *, char *);
/* I don't know why, but realpath breaks on debian. */
static int readResponse(Connection *conn, char *path) {
int fd = -1;
struct stat statbuf;

View File

@@ -9,6 +9,8 @@
/* HEADER GUARD, DO NOT REMOVE*/
#define DYNAMIC_LINKED_PAGES 1
#define SERVER_PATH "/tmp/swebs-serverXXXXX"
/* Where the UNIX server goes */
#endif
/* HEADER GUARD, DO NOT REMOVE*/

View File

@@ -35,4 +35,19 @@ RequestType getType(char *str);
void sendFd(int fd, int dest);
int recvFd(int source);
int createTmpName(char *path);
/* WIll set the 5 characters at the end of path to random data so that that
* file does not exist. For example:
*
* char *path = "/some/path/to/some/dataXXXXX";
* createTmpName(path);
* puts(path);
*
* could output
*
* /some/path/to/some/data12ab6
*
* Returns non-zero on error, uses rand()
* */
#endif

View File

@@ -19,8 +19,10 @@
#include <stdio.h>
#include <ctype.h>
#include <string.h>
#include <stdlib.h>
#include <fcntl.h>
#include <unistd.h>
#include <sys/shm.h>
#include <sys/socket.h>
@@ -165,3 +167,27 @@ int recvFd(int source) {
memcpy(&ret, CMSG_DATA(cmsg), sizeof(ret));
return ret;
}
int createTmpName(char *path) {
size_t len;
char possibleChars[] =
"abcdefghijklmnopqrstuvwxyz"
"ABCDEFGHIJKLMNOPQRSTUVWXYZ"
"0123456789";
len = strlen(path);
if (len < 5)
return 1;
for (;;) {
int i;
for (i = 0; i < 5; i++)
path[len - i - 1] =
possibleChars[rand() % sizeof(possibleChars)];
if (!faccessat(-1, path, F_OK, AT_EACCESS))
continue;
if (faccessat(-1, path, R_OK | W_OK, AT_EACCESS))
return 1;
return 0;
}
}