From 71482861ae99aa642773bd52e0ce26658f175889 Mon Sep 17 00:00:00 2001 From: Nate Choe Date: Sun, 3 Apr 2022 20:42:13 -0500 Subject: [PATCH] Fixed frequent segfault with children --- Makefile | 7 ++++--- example/sitefile | 2 +- src/util.c | 38 ++++++++++++++++++++++++++++++-------- 3 files changed, 35 insertions(+), 12 deletions(-) diff --git a/Makefile b/Makefile index 5c4cc2e..57269eb 100644 --- a/Makefile +++ b/Makefile @@ -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 $@ diff --git a/example/sitefile b/example/sitefile index 2380c2b..d8d93b2 100644 --- a/example/sitefile +++ b/example/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/util.c b/src/util.c index 8818957..354c4de 100644 --- a/src/util.c +++ b/src/util.c @@ -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; }