summaryrefslogtreecommitdiff
path: root/kmodloader.c
diff options
context:
space:
mode:
authorJo-Philipp Wich <jow@openwrt.org>2016-02-09 13:49:55 +0100
committerJo-Philipp Wich <jow@openwrt.org>2016-02-09 13:50:00 +0100
commit5a2d469ab30b73536c920a2a69c7fdf0d2c1a359 (patch)
tree2c70cfa4bf9230542527b8a6a968b650577425c4 /kmodloader.c
parentb0d5399c3db83c2c8f9d8aae944f873343b3a038 (diff)
downloadubox-5a2d469ab30b73536c920a2a69c7fdf0d2c1a359.tar.gz
kmodloader: clean up memory mapping and fix fd leaks in error handling
Signed-off-by: Jo-Philipp Wich <jow@openwrt.org>
Diffstat (limited to 'kmodloader.c')
-rw-r--r--kmodloader.c46
1 files changed, 31 insertions, 15 deletions
diff --git a/kmodloader.c b/kmodloader.c
index 86e3f44..2dc795e 100644
--- a/kmodloader.c
+++ b/kmodloader.c
@@ -277,29 +277,29 @@ static struct module* get_module_info(const char *module, const char *name)
{
int fd = open(module, O_RDONLY);
unsigned int offset, size;
- char *map, *strings, *dep = NULL;
- struct module *m;
+ char *map = MAP_FAILED, *strings, *dep = NULL;
+ struct module *m = NULL;
struct stat s;
if (fd < 0) {
ULOG_ERR("failed to open %s\n", module);
- return NULL;
+ goto out;
}
if (fstat(fd, &s) == -1) {
ULOG_ERR("failed to stat %s\n", module);
- return NULL;
+ goto out;
}
map = mmap(NULL, s.st_size, PROT_READ, MAP_PRIVATE, fd, 0);
if (map == MAP_FAILED) {
ULOG_ERR("failed to mmap %s\n", module);
- return NULL;
+ goto out;
}
if (elf_find_section(map, ".modinfo", &offset, &size)) {
ULOG_ERR("failed to load the .modinfo section from %s\n", module);
- return NULL;
+ goto out;
}
strings = map + offset;
@@ -320,10 +320,16 @@ static struct module* get_module_info(const char *module, const char *name)
}
m = alloc_module(name, dep, s.st_size);
- if (!m)
- return NULL;
- m->state = SCANNED;
+ if (m)
+ m->state = SCANNED;
+
+out:
+ if (map != MAP_FAILED)
+ munmap(map, s.st_size);
+
+ if (fd >= 0)
+ close(fd);
return m;
}
@@ -379,27 +385,28 @@ static int print_modinfo(char *module)
int fd = open(module, O_RDONLY);
unsigned int offset, size;
struct stat s;
- char *map, *strings;
+ char *map = MAP_FAILED, *strings;
+ int rv = -1;
if (fd < 0) {
ULOG_ERR("failed to open %s\n", module);
- return -1;
+ goto out;
}
if (fstat(fd, &s) == -1) {
ULOG_ERR("failed to stat %s\n", module);
- return -1;
+ goto out;
}
map = mmap(NULL, s.st_size, PROT_READ, MAP_PRIVATE, fd, 0);
if (map == MAP_FAILED) {
ULOG_ERR("failed to mmap %s\n", module);
- return -1;
+ goto out;
}
if (elf_find_section(map, ".modinfo", &offset, &size)) {
ULOG_ERR("failed to load the .modinfo section from %s\n", module);
- return -1;
+ goto out;
}
strings = map + offset;
@@ -426,7 +433,16 @@ static int print_modinfo(char *module)
free(dup);
}
- return 0;
+ rv = 0;
+
+out:
+ if (map != MAP_FAILED)
+ munmap(map, s.st_size);
+
+ if (fd >= 0)
+ close(fd);
+
+ return rv;
}
static int deps_available(struct module *m, int verbose)