Browse Source

gluon-web: close FDs after mmap()

Matthias Schiffer 6 years ago
parent
commit
3e292ba06f
2 changed files with 20 additions and 14 deletions
  1. 10 4
      package/gluon-web/src/template_lmo.c
  2. 10 10
      package/gluon-web/src/template_parser.c

+ 10 - 4
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;

+ 10 - 10
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);