| From b348ab2b3597d7717394b72168e452243b47f044 Mon Sep 17 00:00:00 2001 |
| From: Sasha Levin <sashal@kernel.org> |
| Date: Tue, 14 Jul 2020 20:30:18 +0800 |
| Subject: mips/vdso: Fix resource leaks in genvdso.c |
| |
| From: Peng Fan <fanpeng@loongson.cn> |
| |
| [ Upstream commit a859647b4e6bfeb192284d27d24b6a0c914cae1d ] |
| |
| Close "fd" before the return of map_vdso() and close "out_file" |
| in main(). |
| |
| Signed-off-by: Peng Fan <fanpeng@loongson.cn> |
| Signed-off-by: Thomas Bogendoerfer <tsbogend@alpha.franken.de> |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| --- |
| arch/mips/vdso/genvdso.c | 10 ++++++++++ |
| 1 file changed, 10 insertions(+) |
| |
| diff --git a/arch/mips/vdso/genvdso.c b/arch/mips/vdso/genvdso.c |
| index 530a36f465ced..afcc86726448e 100644 |
| --- a/arch/mips/vdso/genvdso.c |
| +++ b/arch/mips/vdso/genvdso.c |
| @@ -126,6 +126,7 @@ static void *map_vdso(const char *path, size_t *_size) |
| if (fstat(fd, &stat) != 0) { |
| fprintf(stderr, "%s: Failed to stat '%s': %s\n", program_name, |
| path, strerror(errno)); |
| + close(fd); |
| return NULL; |
| } |
| |
| @@ -134,6 +135,7 @@ static void *map_vdso(const char *path, size_t *_size) |
| if (addr == MAP_FAILED) { |
| fprintf(stderr, "%s: Failed to map '%s': %s\n", program_name, |
| path, strerror(errno)); |
| + close(fd); |
| return NULL; |
| } |
| |
| @@ -143,6 +145,7 @@ static void *map_vdso(const char *path, size_t *_size) |
| if (memcmp(ehdr->e_ident, ELFMAG, SELFMAG) != 0) { |
| fprintf(stderr, "%s: '%s' is not an ELF file\n", program_name, |
| path); |
| + close(fd); |
| return NULL; |
| } |
| |
| @@ -154,6 +157,7 @@ static void *map_vdso(const char *path, size_t *_size) |
| default: |
| fprintf(stderr, "%s: '%s' has invalid ELF class\n", |
| program_name, path); |
| + close(fd); |
| return NULL; |
| } |
| |
| @@ -165,6 +169,7 @@ static void *map_vdso(const char *path, size_t *_size) |
| default: |
| fprintf(stderr, "%s: '%s' has invalid ELF data order\n", |
| program_name, path); |
| + close(fd); |
| return NULL; |
| } |
| |
| @@ -172,15 +177,18 @@ static void *map_vdso(const char *path, size_t *_size) |
| fprintf(stderr, |
| "%s: '%s' has invalid ELF machine (expected EM_MIPS)\n", |
| program_name, path); |
| + close(fd); |
| return NULL; |
| } else if (swap_uint16(ehdr->e_type) != ET_DYN) { |
| fprintf(stderr, |
| "%s: '%s' has invalid ELF type (expected ET_DYN)\n", |
| program_name, path); |
| + close(fd); |
| return NULL; |
| } |
| |
| *_size = stat.st_size; |
| + close(fd); |
| return addr; |
| } |
| |
| @@ -284,10 +292,12 @@ int main(int argc, char **argv) |
| /* Calculate and write symbol offsets to <output file> */ |
| if (!get_symbols(dbg_vdso_path, dbg_vdso)) { |
| unlink(out_path); |
| + fclose(out_file); |
| return EXIT_FAILURE; |
| } |
| |
| fprintf(out_file, "};\n"); |
| + fclose(out_file); |
| |
| return EXIT_SUCCESS; |
| } |
| -- |
| 2.25.1 |
| |