Removed double free, improved error checking

This commit is contained in:
2022-07-02 12:12:22 -05:00
parent 6db24d8ab6
commit ddd62990b3
7 changed files with 53 additions and 35 deletions

View File

@@ -97,8 +97,8 @@ void freeConnection(Connection *conn) {
free(conn->currLine);
free(conn->body);
for (i = 0; i < conn->fieldCount; i++) {
free(conn->pathFields[i].var.data);
free(conn->pathFields[i].value.data);
free(conn->fields[i].field);
free(conn->fields[i].value);
}
for (i = 0; i < conn->pathFieldCount; i++) {
free(conn->pathFields[i].var.data);
@@ -367,7 +367,8 @@ static int processChar(Connection *conn, char c, Sitefile *site) {
}
if (conn->progress == RECEIVE_BODY &&
conn->receivedBody >= conn->bodylen)
sendResponse(conn, site);
if (sendResponse(conn, site))
return 1;
return 0;
}

View File

@@ -51,7 +51,7 @@ static ConnInfo *conninfo;
* are needed. */
static const int signals[] = {
SIGPIPE, SIGHUP, SIGINT, SIGQUIT, SIGILL, SIGTRAP, SIGABRT, SIGBUS, SIGFPE,
SIGKILL, SIGSEGV, SIGTERM, SIGTTIN, SIGTTOU, SIGURG, SIGXCPU, SIGXFSZ, SIGPIPE,
SIGKILL, SIGSEGV, SIGTERM, SIGTTIN, SIGTTOU, SIGURG, SIGXCPU, SIGXFSZ,
};
static void exitClean(int signal) {
@@ -60,26 +60,6 @@ static void exitClean(int signal) {
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;
@@ -156,6 +136,7 @@ int main(int argc, char **argv) {
if (listeners[i] == NULL) {
fprintf(stderr, "Failed to listen on port %hu\n",
site->ports[i].num);
exit(EXIT_FAILURE);
}
pollfds[i].fd = listenerfd(listeners[i]);
pollfds[i].events = POLLIN;

View File

@@ -180,23 +180,25 @@ foundport:
if (fullmatch(&site->content[i].path, conn->path.data) == 0) {
switch (site->content[i].command) {
case READ:
readResponse(conn,
site->content[i].arg);
if (readResponse(conn,
site->content[i].arg))
return 1;
break;
case THROW:
sendErrorResponse(conn->stream,
site->content[i].arg);
if (sendErrorResponse(conn->stream,
site->content[i].arg))
return 1;
break;
case LINKED:
#if DYNAMIC_LINKED_PAGES
if (!site->getResponse)
sendErrorResponse(conn->stream,
ERROR_500);
else
linkedResponse(conn,
site->getResponse);
else if (linkedResponse(conn,
site->getResponse))
return 1;
#else
/* Unreachable state */
/* Unreachable state (filtered by startup) */
sendErrorResponse(conn->stream,
ERROR_500);
#endif

View File

@@ -22,6 +22,7 @@
#include <unistd.h>
#include <swebs/util.h>
#include <swebs/responseutil.h>
#define CONST_FIELDS "Server: swebs/0.1\r\n"
@@ -29,8 +30,12 @@
static int resilientSend(Stream *stream, void *data, size_t len) {
char *buffer = (char *) data;
size_t left = len;
while (left) {
ssize_t sent = sendStream(stream, buffer, left);
ssize_t sent;
sent = sendStream(stream, buffer, left);
if (sent < 0)
return 1;
if (sent == 0)

View File

@@ -97,8 +97,11 @@ void runServer(int connfd, Sitefile *site, int *pending, int id,
}
for (i = 1; i < connCount; i++) {
if (updateConnection(connections + i, site))
goto remove;
if (fds[i].revents & POLLIN) {
createFormatLog("Connection %d has data", i);
if (updateConnection(connections + i, site))
goto remove;
}
continue;
remove:
freeConnection(connections + i);
@@ -115,6 +118,7 @@ remove:
Stream *newstream;
int newfd;
int portind;
createLog("Main fd has data");
newfd = recvFd(connfd);
if (newfd < 0) {
createLog("Message received that included an invalid fd, quitting");

View File

@@ -58,4 +58,8 @@ int createTmpName(char *path);
*
* Returns non-zero on error, uses rand()
* */
void setsignal(int signal, void (*handler)(int));
void unsetsignal(int signal);
#endif

View File

@@ -23,6 +23,7 @@
#include <stdarg.h>
#include <fcntl.h>
#include <signal.h>
#include <unistd.h>
#include <sys/shm.h>
#include <sys/socket.h>
@@ -257,3 +258,23 @@ int createTmpName(char *path) {
return 0;
}
}
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 = 0;
sigaction(signal, &action, NULL);
}
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);
}