From 3e292ba06f5a6df6c31ce66e3d4a585a65e0e8d1 Mon Sep 17 00:00:00 2001 From: Matthias Schiffer Date: Fri, 23 Feb 2018 00:03:57 +0100 Subject: [PATCH] gluon-web: close FDs after mmap() --- package/gluon-web/src/template_lmo.c | 14 ++++++++++---- package/gluon-web/src/template_parser.c | 20 ++++++++++---------- 2 files changed, 20 insertions(+), 14 deletions(-) diff --git a/package/gluon-web/src/template_lmo.c b/package/gluon-web/src/template_lmo.c index 6cab6274..365b0e30 100644 --- a/package/gluon-web/src/template_lmo.c +++ b/package/gluon-web/src/template_lmo.c @@ -128,20 +128,26 @@ 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; uint32_t idx_offset = get_be32(ar->end - sizeof(uint32_t)); - ar->index = (const lmo_entry_t *)(ar->data + idx_offset); + ar->index = (const lmo_entry_t *)(ar->data + idx_offset); if ((const char *)ar->index > (ar->end - sizeof(uint32_t))) goto err; diff --git a/package/gluon-web/src/template_parser.c b/package/gluon-web/src/template_parser.c index 550d544a..a0efcf4d 100644 --- a/package/gluon-web/src/template_parser.c +++ b/package/gluon-web/src/template_parser.c @@ -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);