Fixed memory leak, freed things properly, and rearranged some things

This commit is contained in:
2022-07-01 08:48:05 -05:00
parent d843ffab93
commit ad88090956
2 changed files with 35 additions and 11 deletions

View File

@@ -45,6 +45,7 @@ int newConnection(Stream *stream, Connection *ret, int portind) {
free(ret->currLine); free(ret->currLine);
return 1; return 1;
} }
ret->fieldCount = 0;
ret->allocatedPathFields = 10; ret->allocatedPathFields = 10;
ret->pathFields = malloc(ret->allocatedPathFields * sizeof(PathField)); ret->pathFields = malloc(ret->allocatedPathFields * sizeof(PathField));
@@ -76,27 +77,35 @@ int newConnection(Stream *stream, Connection *ret, int portind) {
void resetConnection(Connection *conn) { void resetConnection(Connection *conn) {
long i; long i;
conn->progress = RECEIVE_REQUEST; conn->progress = RECEIVE_REQUEST;
conn->fieldCount = 0;
free(conn->body); free(conn->body);
conn->body = NULL; conn->body = NULL;
conn->pathFieldCount = 0; for (i = 0; i < conn->fieldCount; i++) {
free(conn->fields[i].field);
free(conn->fields[i].value);
}
conn->fieldCount = 0;
for (i = 0; i < conn->pathFieldCount; i++) { for (i = 0; i < conn->pathFieldCount; i++) {
free(conn->pathFields[i].var.data); free(conn->pathFields[i].var.data);
free(conn->pathFields[i].value.data); free(conn->pathFields[i].value.data);
} }
conn->pathFieldCount = 0;
} }
void freeConnection(Connection *conn) { void freeConnection(Connection *conn) {
long i; long i;
freeStream(conn->stream); freeStream(conn->stream);
free(conn->currLine); free(conn->currLine);
free(conn->fields);
free(conn->body); free(conn->body);
for (i = 0; i < conn->fieldCount; i++) { for (i = 0; i < conn->fieldCount; i++) {
free(conn->pathFields[i].var.data); free(conn->pathFields[i].var.data);
free(conn->pathFields[i].value.data); free(conn->pathFields[i].value.data);
} }
for (i = 0; i < conn->pathFieldCount; i++) {
free(conn->pathFields[i].var.data);
free(conn->pathFields[i].value.data);
}
free(conn->pathFields); free(conn->pathFields);
free(conn->fields);
} }
static int createBinaryString(BinaryString *ret) { static int createBinaryString(BinaryString *ret) {
@@ -265,15 +274,21 @@ static int processField(Connection *conn) {
Field *newfields; Field *newfields;
if (conn->currLineLen == 0) { if (conn->currLineLen == 0) {
conn->progress = RECEIVE_BODY; conn->progress = RECEIVE_BODY;
conn->bodylen = 0;
for (i = 0; i < conn->fieldCount; i++) { for (i = 0; i < conn->fieldCount; i++) {
if (strcmp(conn->fields[i].field, if (strcmp(conn->fields[i].field,
"Content-Length") == 0) "Content-Length") == 0) {
conn->bodylen = atol(conn->fields[i].value); conn->bodylen = atol(conn->fields[i].value);
goto foundlen;
}
} }
conn->bodylen = 0;
conn->body = NULL;
goto lendone;
foundlen:
conn->body = malloc(conn->bodylen); conn->body = malloc(conn->bodylen);
if (conn->body == NULL) if (conn->body == NULL)
return 1; return 1;
lendone:
conn->receivedBody = 0; conn->receivedBody = 0;
return 0; return 0;
} }
@@ -294,12 +309,18 @@ static int processField(Connection *conn) {
return 1; return 1;
field = malloc(split - line + 1); field = malloc(split - line + 1);
if (field == NULL)
return 1;
memcpy(field, line, split - line); memcpy(field, line, split - line);
field[split - line] = '\0'; field[split - line] = '\0';
linelen -= split - line + 2; linelen -= split - line + 2;
line += split - line + 2; line += split - line + 2;
value = malloc(linelen + 1); value = malloc(linelen + 1);
if (value == NULL) {
free(field);
return 1;
}
memcpy(value, line, linelen + 1); memcpy(value, line, linelen + 1);
conn->fields[conn->fieldCount].field = field; conn->fields[conn->fieldCount].field = field;
@@ -321,11 +342,10 @@ static int processChar(Connection *conn, char c, Sitefile *site) {
return 1; return 1;
conn->currLine = newline; conn->currLine = newline;
} }
conn->currLine[conn->currLineLen++] = c;
if (c == '\n') { if (c == '\n') {
if (--conn->currLineLen <= 0) if (--conn->currLineLen < 0)
return 1; return 1;
if (conn->currLine[--conn->currLineLen] != '\r') if (conn->currLine[conn->currLineLen] != '\r')
return 1; return 1;
conn->currLine[conn->currLineLen] = '\0'; conn->currLine[conn->currLineLen] = '\0';
if (conn->progress == RECEIVE_REQUEST) { if (conn->progress == RECEIVE_REQUEST) {
@@ -338,6 +358,8 @@ static int processChar(Connection *conn, char c, Sitefile *site) {
} }
conn->currLineLen = 0; conn->currLineLen = 0;
} }
else
conn->currLine[conn->currLineLen++] = c;
} }
else if (conn->progress == RECEIVE_BODY) { else if (conn->progress == RECEIVE_BODY) {
if (conn->receivedBody < conn->bodylen) if (conn->receivedBody < conn->bodylen)
@@ -366,8 +388,9 @@ int updateConnection(Connection *conn, Sitefile *site) {
if (clock_gettime(CLOCK_MONOTONIC, &currentTime) < 0) if (clock_gettime(CLOCK_MONOTONIC, &currentTime) < 0)
return 1; return 1;
if (port->timeout > 0 && if (port->timeout > 0 &&
diff(&conn->lastdata, &currentTime) > port->timeout) diff(&conn->lastdata, &currentTime) > port->timeout) {
return 1; return 1;
}
received = recvStream(conn->stream, buff, sizeof(buff)); received = recvStream(conn->stream, buff, sizeof(buff));
if (received < 0) if (received < 0)
return errno != EAGAIN; return errno != EAGAIN;

View File

@@ -102,12 +102,13 @@ void runServer(int connfd, Sitefile *site, int *pending, int id,
continue; continue;
remove: remove:
freeConnection(connections + i); freeConnection(connections + i);
connCount--; --connCount;
memcpy(fds + i, fds + connCount - 1, memcpy(fds + i, fds + connCount - 1,
sizeof(struct pollfd)); sizeof(struct pollfd));
memcpy(connections + i, fds + connCount, memcpy(connections + i, fds + connCount,
sizeof(struct pollfd)); sizeof(struct pollfd));
pending[id]--; --pending[id];
--i;
} }
if (fds[0].revents & POLLIN) { if (fds[0].revents & POLLIN) {