Fixed frequent segfault with children

This commit is contained in:
Nate Choe
2022-04-03 20:42:13 -05:00
parent 12281a030d
commit 71482861ae
3 changed files with 35 additions and 12 deletions

View File

@@ -1,15 +1,16 @@
SRC = $(wildcard src/*.c)
OBJ = $(subst .c,.o,$(subst src,work,$(SRC)))
LIBS = -pie -lrt -ldl $(shell pkg-config --libs gnutls)
LIBS = gnutls
LDFLAGS = -pie -lrt -ldl $(shell pkg-config --libs $(LIBS))
CFLAGS := -O2 -pipe -Wall -Wpedantic -Wshadow -ansi
CFLAGS += -Isrc/ -fpie -D_POSIX_C_SOURCE=200809L $(shell pkg-config --cflags gnutls)
CFLAGS += -Isrc/ -fpie -D_POSIX_C_SOURCE=200809L $(shell pkg-config --cflags $(LIBS))
INSTALLDIR := /usr/sbin
HEADERDIR := /usr/include/
INCLUDE_DIRECTORY := swebs
OUT = swebs
build/$(OUT): $(OBJ)
$(CC) $(OBJ) -o build/$(OUT) $(LIBS)
$(CC) $(OBJ) -o build/$(OUT) $(LDFLAGS)
work/%.o: src/%.c $(wildcard src/swebs/*.h)
$(CC) $(CFLAGS) $< -c -o $@

View File

@@ -1,6 +1,6 @@
define port 8000
define transport TLS
#define transport TLS
define key domain.key
define cert domain.crt
define timeout 2000

View File

@@ -129,17 +129,39 @@ void sendFd(int fd, int dest) {
}
int recvFd(int source) {
union {
char buff[CMSG_SPACE(sizeof(int))];
struct cmsghdr align;
} cmsghdr;
struct msghdr msg;
struct cmsghdr *cmsg;
char cmsgbuf[CMSG_SPACE(sizeof(int))];
unsigned char *data;
struct iovec iov;
int data;
ssize_t nr;
int ret;
memset(&msg, 0, sizeof(msg));
msg.msg_control = cmsgbuf;
msg.msg_controllen = sizeof(cmsgbuf);
recvmsg(source, &msg, 0);
msg.msg_name = NULL;
msg.msg_namelen = 0;
iov.iov_base = &data;
iov.iov_len = sizeof(data);
msg.msg_iov = &iov;
msg.msg_iovlen = 1;
msg.msg_control = cmsghdr.buff;
msg.msg_controllen = sizeof(cmsghdr.buff);
nr = recvmsg(source, &msg, 0);
if (nr < 0)
return -1;
cmsg = CMSG_FIRSTHDR(&msg);
data = CMSG_DATA(cmsg);
memcpy(&ret, data, sizeof(ret));
if (cmsg == NULL || cmsg->cmsg_len != CMSG_LEN(sizeof(data)))
return -1;
if (cmsg->cmsg_level != SOL_SOCKET)
return -1;
if (cmsg->cmsg_type != SCM_RIGHTS)
return -1;
memcpy(&ret, CMSG_DATA(cmsg), sizeof(ret));
return ret;
}