Skip to content

Commit 684bbc2

Browse files
committed
Merge pull request #160 from acv/libhttpd-fixes
Libhttpd fixes
2 parents 897b715 + e9a9634 commit 684bbc2

File tree

2 files changed

+19
-13
lines changed

2 files changed

+19
-13
lines changed

libhttpd/api.c

Lines changed: 17 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -264,7 +264,11 @@ int port;
264264
}
265265
# ifdef SO_REUSEADDR
266266
opt = 1;
267-
setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, (char *)&opt, sizeof(int));
267+
if (setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, (char *)&opt, sizeof(int)) < 0) {
268+
close(sock);
269+
free(new);
270+
return NULL;
271+
}
268272
# endif
269273
new->serverSock = sock;
270274
bzero(&addr, sizeof(addr));
@@ -318,8 +322,8 @@ struct timeval *timeout;
318322
return (NULL);
319323
}
320324
if (timeout != 0 && result == 0) {
321-
return (NULL);
322325
server->lastError = 0;
326+
return (NULL);
323327
}
324328
if (result > 0) {
325329
break;
@@ -675,14 +679,15 @@ httpdSendHeaders(request * r)
675679
void
676680
httpdSetResponse(request * r, const char *msg)
677681
{
678-
strncpy(r->response.response, msg, HTTP_MAX_URL);
682+
strncpy(r->response.response, msg, HTTP_MAX_URL - 1);
679683
r->response.response[HTTP_MAX_URL - 1] = 0;
680684
}
681685

682686
void
683687
httpdSetContentType(request * r, const char *type)
684688
{
685-
strcpy(r->response.contentType, type);
689+
strncpy(r->response.contentType, type, HTTP_MAX_URL - 1);
690+
r->response.contentType[HTTP_MAX_URL - 1] = 0;
686691
}
687692

688693
void
@@ -716,6 +721,7 @@ httpdOutput(request * r, const char *msg)
716721
src = msg;
717722
dest = buf;
718723
count = 0;
724+
memset(buf, 0, HTTP_MAX_LEN);
719725
while (*src && count < HTTP_MAX_LEN) {
720726
if (*src == '$') {
721727
const char *tmp;
@@ -732,18 +738,17 @@ httpdOutput(request * r, const char *msg)
732738
}
733739
*cp = 0;
734740
curVar = httpdGetVariableByName(r, varName);
735-
if (curVar) {
741+
if (curVar && ((count + strlen(curVar->value)) < HTTP_MAX_LEN)) {
736742
strcpy(dest, curVar->value);
737743
dest = dest + strlen(dest);
738744
count += strlen(dest);
745+
src = src + strlen(varName) + 1;
746+
continue;
739747
} else {
740-
*dest++ = '$';
741-
strcpy(dest, varName);
742-
dest += strlen(varName);
743-
count += 1 + strlen(varName);
748+
*dest++ = *src++;
749+
count++;
750+
continue;
744751
}
745-
src = src + strlen(varName) + 1;
746-
continue;
747752
}
748753
*dest++ = *src++;
749754
count++;
@@ -780,6 +785,7 @@ va_dcl
780785
if (r->response.headersSent == 0)
781786
httpdSendHeaders(r);
782787
vsnprintf(buf, HTTP_MAX_LEN, fmt, args);
788+
va_end(args); /* Works with both stdargs.h and varargs.h */
783789
r->response.responseLength += strlen(buf);
784790
_httpd_net_write(r->clientSock, buf, strlen(buf));
785791
}

libhttpd/protocol.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -321,11 +321,11 @@ _httpd_storeData(request * r, char *query)
321321
if (!query)
322322
return;
323323

324-
var = (char *)malloc(strlen(query));
324+
var = (char *)malloc(strlen(query) + 1);
325325

326326
cp = query;
327327
cp2 = var;
328-
bzero(var, strlen(query));
328+
bzero(var, strlen(query) + 1);
329329
val = NULL;
330330
while (*cp) {
331331
if (*cp == '=') {

0 commit comments

Comments
 (0)