Commit a859647b authored by Peng Fan's avatar Peng Fan Committed by Thomas Bogendoerfer

mips/vdso: Fix resource leaks in genvdso.c

Close "fd" before the return of map_vdso() and close "out_file"
in main().
Signed-off-by: default avatarPeng Fan <fanpeng@loongson.cn>
Signed-off-by: default avatarThomas Bogendoerfer <tsbogend@alpha.franken.de>
parent c8353fbd
...@@ -122,6 +122,7 @@ static void *map_vdso(const char *path, size_t *_size) ...@@ -122,6 +122,7 @@ static void *map_vdso(const char *path, size_t *_size)
if (fstat(fd, &stat) != 0) { if (fstat(fd, &stat) != 0) {
fprintf(stderr, "%s: Failed to stat '%s': %s\n", program_name, fprintf(stderr, "%s: Failed to stat '%s': %s\n", program_name,
path, strerror(errno)); path, strerror(errno));
close(fd);
return NULL; return NULL;
} }
...@@ -130,6 +131,7 @@ static void *map_vdso(const char *path, size_t *_size) ...@@ -130,6 +131,7 @@ static void *map_vdso(const char *path, size_t *_size)
if (addr == MAP_FAILED) { if (addr == MAP_FAILED) {
fprintf(stderr, "%s: Failed to map '%s': %s\n", program_name, fprintf(stderr, "%s: Failed to map '%s': %s\n", program_name,
path, strerror(errno)); path, strerror(errno));
close(fd);
return NULL; return NULL;
} }
...@@ -139,6 +141,7 @@ static void *map_vdso(const char *path, size_t *_size) ...@@ -139,6 +141,7 @@ static void *map_vdso(const char *path, size_t *_size)
if (memcmp(ehdr->e_ident, ELFMAG, SELFMAG) != 0) { if (memcmp(ehdr->e_ident, ELFMAG, SELFMAG) != 0) {
fprintf(stderr, "%s: '%s' is not an ELF file\n", program_name, fprintf(stderr, "%s: '%s' is not an ELF file\n", program_name,
path); path);
close(fd);
return NULL; return NULL;
} }
...@@ -150,6 +153,7 @@ static void *map_vdso(const char *path, size_t *_size) ...@@ -150,6 +153,7 @@ static void *map_vdso(const char *path, size_t *_size)
default: default:
fprintf(stderr, "%s: '%s' has invalid ELF class\n", fprintf(stderr, "%s: '%s' has invalid ELF class\n",
program_name, path); program_name, path);
close(fd);
return NULL; return NULL;
} }
...@@ -161,6 +165,7 @@ static void *map_vdso(const char *path, size_t *_size) ...@@ -161,6 +165,7 @@ static void *map_vdso(const char *path, size_t *_size)
default: default:
fprintf(stderr, "%s: '%s' has invalid ELF data order\n", fprintf(stderr, "%s: '%s' has invalid ELF data order\n",
program_name, path); program_name, path);
close(fd);
return NULL; return NULL;
} }
...@@ -168,15 +173,18 @@ static void *map_vdso(const char *path, size_t *_size) ...@@ -168,15 +173,18 @@ static void *map_vdso(const char *path, size_t *_size)
fprintf(stderr, fprintf(stderr,
"%s: '%s' has invalid ELF machine (expected EM_MIPS)\n", "%s: '%s' has invalid ELF machine (expected EM_MIPS)\n",
program_name, path); program_name, path);
close(fd);
return NULL; return NULL;
} else if (swap_uint16(ehdr->e_type) != ET_DYN) { } else if (swap_uint16(ehdr->e_type) != ET_DYN) {
fprintf(stderr, fprintf(stderr,
"%s: '%s' has invalid ELF type (expected ET_DYN)\n", "%s: '%s' has invalid ELF type (expected ET_DYN)\n",
program_name, path); program_name, path);
close(fd);
return NULL; return NULL;
} }
*_size = stat.st_size; *_size = stat.st_size;
close(fd);
return addr; return addr;
} }
...@@ -293,10 +301,12 @@ int main(int argc, char **argv) ...@@ -293,10 +301,12 @@ int main(int argc, char **argv)
/* Calculate and write symbol offsets to <output file> */ /* Calculate and write symbol offsets to <output file> */
if (!get_symbols(dbg_vdso_path, dbg_vdso)) { if (!get_symbols(dbg_vdso_path, dbg_vdso)) {
unlink(out_path); unlink(out_path);
fclose(out_file);
return EXIT_FAILURE; return EXIT_FAILURE;
} }
fprintf(out_file, "};\n"); fprintf(out_file, "};\n");
fclose(out_file);
return EXIT_SUCCESS; return EXIT_SUCCESS;
} }
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment