gluon-web: close FDs after mmap()

This commit is contained in:
Matthias Schiffer 2018-02-23 00:03:57 +01:00
parent 99b4d2eaf0
commit 3e292ba06f
No known key found for this signature in database
GPG Key ID: 16EF3F64CB201D9C
2 changed files with 20 additions and 14 deletions

View File

@ -128,14 +128,20 @@ static lmo_archive_t * lmo_open(const char *file)
lmo_archive_t *ar = NULL;
struct stat s;
if ((fd = open(file, O_RDONLY|O_CLOEXEC)) == -1)
fd = open(file, O_RDONLY|O_CLOEXEC);
if (fd < 0)
goto err;
if (fstat(fd, &s) == -1)
if (fstat(fd, &s))
goto err;
if ((ar = calloc(1, sizeof(*ar))) != NULL) {
if ((ar->data = mmap(NULL, s.st_size, PROT_READ, MAP_SHARED, fd, 0)) == MAP_FAILED)
ar->data = mmap(NULL, s.st_size, PROT_READ, MAP_SHARED, fd, 0);
close(fd);
fd = -1;
if (ar->data == MAP_FAILED)
goto err;
ar->end = ar->data + s.st_size;

View File

@ -56,7 +56,6 @@ struct template_chunk {
/* parser state */
struct template_parser {
int fd;
size_t size;
char *data;
char *off;
@ -96,24 +95,28 @@ static struct template_parser * template_init(struct template_parser *parser)
struct template_parser * template_open(const char *file)
{
int fd = -1;
struct stat s;
struct template_parser *parser;
if (!(parser = calloc(1, sizeof(*parser))))
goto err;
parser->fd = -1;
parser->file = file;
if ((parser->fd = open(file, O_RDONLY|O_CLOEXEC)) < 0)
fd = open(file, O_RDONLY|O_CLOEXEC);
if (fd < 0)
goto err;
if (fstat(parser->fd, &s))
if (fstat(fd, &s))
goto err;
parser->size = s.st_size;
parser->data = mmap(NULL, parser->size, PROT_READ, MAP_PRIVATE,
parser->fd, 0);
fd, 0);
close(fd);
fd = -1;
if (parser->data == MAP_FAILED)
goto err;
@ -121,6 +124,8 @@ struct template_parser * template_open(const char *file)
return template_init(parser);
err:
if (fd >= 0)
close(fd);
template_close(parser);
return NULL;
}
@ -132,8 +137,6 @@ struct template_parser * template_string(const char *str, size_t len)
if (!(parser = calloc(1, sizeof(*parser))))
goto err;
parser->fd = -1;
parser->size = len;
parser->data = (char *)str;
@ -155,9 +158,6 @@ void template_close(struct template_parser *parser)
if (parser->file) {
if ((parser->data != NULL) && (parser->data != MAP_FAILED))
munmap(parser->data, parser->size);
if (parser->fd >= 0)
close(parser->fd);
}
free(parser);