fix memory leak in sendfile()
FILE *fp is not closed.
This commit is contained in:
parent
a551445fba
commit
3efce07af9
1 changed files with 13 additions and 5 deletions
18
quark.c
18
quark.c
|
@ -407,12 +407,14 @@ sendfile(int fd, char *name, struct request *r, struct stat *st, char *mime,
|
||||||
|
|
||||||
/* open file */
|
/* open file */
|
||||||
if (!(fp = fopen(name, "r"))) {
|
if (!(fp = fopen(name, "r"))) {
|
||||||
return sendstatus(fd, S_FORBIDDEN);
|
s = sendstatus(fd, S_FORBIDDEN);
|
||||||
|
goto cleanup;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* seek to lower bound */
|
/* seek to lower bound */
|
||||||
if (fseek(fp, lower, SEEK_SET)) {
|
if (fseek(fp, lower, SEEK_SET)) {
|
||||||
return sendstatus(fd, S_INTERNAL_SERVER_ERROR);
|
s = sendstatus(fd, S_INTERNAL_SERVER_ERROR);
|
||||||
|
goto cleanup;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* send header as late as possible */
|
/* send header as late as possible */
|
||||||
|
@ -428,16 +430,19 @@ sendfile(int fd, char *name, struct request *r, struct stat *st, char *mime,
|
||||||
"Content-Length: %zu\r\n",
|
"Content-Length: %zu\r\n",
|
||||||
s, status_str[s], timestamp(0, t1),
|
s, status_str[s], timestamp(0, t1),
|
||||||
timestamp(st->st_mtim.tv_sec, t2), mime, upper - lower) < 0) {
|
timestamp(st->st_mtim.tv_sec, t2), mime, upper - lower) < 0) {
|
||||||
return S_REQUEST_TIMEOUT;
|
s = S_REQUEST_TIMEOUT;
|
||||||
|
goto cleanup;
|
||||||
}
|
}
|
||||||
if (range) {
|
if (range) {
|
||||||
if (dprintf(fd, "Content-Range: bytes %zu-%zu/%zu\r\n",
|
if (dprintf(fd, "Content-Range: bytes %zu-%zu/%zu\r\n",
|
||||||
lower, upper - 1, st->st_size) < 0) {
|
lower, upper - 1, st->st_size) < 0) {
|
||||||
return S_REQUEST_TIMEOUT;
|
s = S_REQUEST_TIMEOUT;
|
||||||
|
goto cleanup;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (dprintf(fd, "\r\n") < 0) {
|
if (dprintf(fd, "\r\n") < 0) {
|
||||||
return S_REQUEST_TIMEOUT;
|
s = S_REQUEST_TIMEOUT;
|
||||||
|
goto cleanup;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (r->method == M_GET) {
|
if (r->method == M_GET) {
|
||||||
|
@ -460,6 +465,9 @@ sendfile(int fd, char *name, struct request *r, struct stat *st, char *mime,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
cleanup:
|
||||||
|
if (fp)
|
||||||
|
fclose(fp);
|
||||||
|
|
||||||
return s;
|
return s;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue