diff options
author | Russell King <rmk@arm.linux.org.uk> | 2016-06-06 18:00:00 +0100 |
---|---|---|
committer | Simon Horman <horms@verge.net.au> | 2016-06-08 09:22:28 +0900 |
commit | 38c18bb7d1e2db23491619928ca722750d510ce5 (patch) | |
tree | 378f733b24be0c82d69e5abdde04ce1c98b4935a | |
parent | 2185c79d3bf443be85809f3d0e0103035ac7140b (diff) | |
download | kexec-tools-38c18bb7d1e2db23491619928ca722750d510ce5.tar.gz |
arm: fix get_kernel_stext_sym() to close its file
Fix get_kernel_stext_sym() so that it closes its file once it's
finsihed with it - there's no need to leak file descriptors.
Reviewed-by: Pratyush Anand <panand@redhat.com>
Signed-off-by: Russell King <rmk@arm.linux.org.uk>
Signed-off-by: Simon Horman <horms@verge.net.au>
-rw-r--r-- | kexec/arch/arm/crashdump-arm.c | 23 |
1 files changed, 16 insertions, 7 deletions
diff --git a/kexec/arch/arm/crashdump-arm.c b/kexec/arch/arm/crashdump-arm.c index b523e5f1..a390187f 100644 --- a/kexec/arch/arm/crashdump-arm.c +++ b/kexec/arch/arm/crashdump-arm.c @@ -71,25 +71,34 @@ static unsigned long long get_kernel_stext_sym(void) char sym[128]; char line[128]; FILE *fp; - unsigned long long vaddr; + unsigned long long vaddr = 0; char type; - fp = fopen(kallsyms, "r"); if (!fp) { + fp = fopen(kallsyms, "r"); + if (!fp) { fprintf(stderr, "Cannot open %s\n", kallsyms); return 0; } while(fgets(line, sizeof(line), fp) != NULL) { - if (sscanf(line, "%Lx %c %s", &vaddr, &type, sym) != 3) + unsigned long long addr; + + if (sscanf(line, "%Lx %c %s", &addr, &type, sym) != 3) continue; + if (strcmp(sym, stext) == 0) { - dbgprintf("kernel symbol %s vaddr = %16llx\n", stext, vaddr); - return vaddr; + dbgprintf("kernel symbol %s vaddr = %#llx\n", stext, addr); + vaddr = addr; + break; } } - fprintf(stderr, "Cannot get kernel %s symbol address\n", stext); - return 0; + fclose(fp); + + if (vaddr == 0) + fprintf(stderr, "Cannot get kernel %s symbol address\n", stext); + + return vaddr; } static int get_kernel_page_offset(struct kexec_info *info, |