diff options
author | normal <normal@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2018-07-08 23:43:14 +0000 |
---|---|---|
committer | normal <normal@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2018-07-08 23:43:14 +0000 |
commit | 0528838b377ff3e5161d47df753c3203b028bf57 (patch) | |
tree | 7c3a26b6170f11745fcecaec0096f48957d3f1f2 /addr2line.c | |
parent | e1a8d281eb0d34acbf016c9f9fcd2ba91962dbe7 (diff) |
addr2line.c: no need to keep fd around after mmap
POSIX mmap(3) manpage stipulates mmap bumps the reference
count of the file description. Thus keeping a file descriptor
to maintain the reference is not necessary.
If this didn't work, every extension .so would require a
permanent FD, which is obviously not the case.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@63908 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'addr2line.c')
-rw-r--r-- | addr2line.c | 8 |
1 files changed, 2 insertions, 6 deletions
diff --git a/addr2line.c b/addr2line.c index 09fcc3c225..db46504cb0 100644 --- a/addr2line.c +++ b/addr2line.c @@ -119,7 +119,6 @@ typedef struct { typedef struct obj_info obj_info_t; struct obj_info { const char *path; /* object path */ - int fd; void *mapped; size_t mapped_size; uintptr_t base_addr; @@ -525,6 +524,7 @@ fill_lines(int num_traces, void **traces, int check_debuglink, kprintf("mmap: %s\n", strerror(e)); goto fail; } + close(fd); ehdr = (ElfW(Ehdr) *)file; if (memcmp(ehdr->e_ident, "\177ELF", 4) != 0) { @@ -532,11 +532,8 @@ fill_lines(int num_traces, void **traces, int check_debuglink, * Huh? Maybe filename was overridden by setproctitle() and * it match non-elf file. */ - close(fd); goto fail; } - - obj->fd = fd; obj->mapped = file; obj->mapped_size = (size_t)filesize; @@ -790,9 +787,8 @@ next_line: while (obj) { obj_info_t *o = obj; obj = o->next; - if (o->fd) { + if (o->mapped_size) { munmap(o->mapped, o->mapped_size); - close(o->fd); } free(o); } |