gluon-web: close FDs after mmap()
This commit is contained in:
parent
99b4d2eaf0
commit
3e292ba06f
@ -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;
|
||||
|
@ -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);
|
||||
|
Loading…
Reference in New Issue
Block a user