Fixed frequent segfault with children
This commit is contained in:
7
Makefile
7
Makefile
@@ -1,15 +1,16 @@
|
|||||||
SRC = $(wildcard src/*.c)
|
SRC = $(wildcard src/*.c)
|
||||||
OBJ = $(subst .c,.o,$(subst src,work,$(SRC)))
|
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 := -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
|
INSTALLDIR := /usr/sbin
|
||||||
HEADERDIR := /usr/include/
|
HEADERDIR := /usr/include/
|
||||||
INCLUDE_DIRECTORY := swebs
|
INCLUDE_DIRECTORY := swebs
|
||||||
OUT = swebs
|
OUT = swebs
|
||||||
|
|
||||||
build/$(OUT): $(OBJ)
|
build/$(OUT): $(OBJ)
|
||||||
$(CC) $(OBJ) -o build/$(OUT) $(LIBS)
|
$(CC) $(OBJ) -o build/$(OUT) $(LDFLAGS)
|
||||||
|
|
||||||
work/%.o: src/%.c $(wildcard src/swebs/*.h)
|
work/%.o: src/%.c $(wildcard src/swebs/*.h)
|
||||||
$(CC) $(CFLAGS) $< -c -o $@
|
$(CC) $(CFLAGS) $< -c -o $@
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
define port 8000
|
define port 8000
|
||||||
|
|
||||||
define transport TLS
|
#define transport TLS
|
||||||
define key domain.key
|
define key domain.key
|
||||||
define cert domain.crt
|
define cert domain.crt
|
||||||
define timeout 2000
|
define timeout 2000
|
||||||
|
|||||||
38
src/util.c
38
src/util.c
@@ -129,17 +129,39 @@ void sendFd(int fd, int dest) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
int recvFd(int source) {
|
int recvFd(int source) {
|
||||||
|
union {
|
||||||
|
char buff[CMSG_SPACE(sizeof(int))];
|
||||||
|
struct cmsghdr align;
|
||||||
|
} cmsghdr;
|
||||||
struct msghdr msg;
|
struct msghdr msg;
|
||||||
struct cmsghdr *cmsg;
|
struct cmsghdr *cmsg;
|
||||||
char cmsgbuf[CMSG_SPACE(sizeof(int))];
|
struct iovec iov;
|
||||||
unsigned char *data;
|
int data;
|
||||||
|
ssize_t nr;
|
||||||
int ret;
|
int ret;
|
||||||
memset(&msg, 0, sizeof(msg));
|
|
||||||
msg.msg_control = cmsgbuf;
|
msg.msg_name = NULL;
|
||||||
msg.msg_controllen = sizeof(cmsgbuf);
|
msg.msg_namelen = 0;
|
||||||
recvmsg(source, &msg, 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);
|
cmsg = CMSG_FIRSTHDR(&msg);
|
||||||
data = CMSG_DATA(cmsg);
|
if (cmsg == NULL || cmsg->cmsg_len != CMSG_LEN(sizeof(data)))
|
||||||
memcpy(&ret, data, sizeof(ret));
|
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;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user