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
This commit is contained in:
normal 2018-07-08 23:43:14 +00:00
parent e1a8d281eb
commit 0528838b37

View File

@ -119,7 +119,6 @@ typedef struct {
typedef struct obj_info obj_info_t; typedef struct obj_info obj_info_t;
struct obj_info { struct obj_info {
const char *path; /* object path */ const char *path; /* object path */
int fd;
void *mapped; void *mapped;
size_t mapped_size; size_t mapped_size;
uintptr_t base_addr; uintptr_t base_addr;
@ -525,6 +524,7 @@ fill_lines(int num_traces, void **traces, int check_debuglink,
kprintf("mmap: %s\n", strerror(e)); kprintf("mmap: %s\n", strerror(e));
goto fail; goto fail;
} }
close(fd);
ehdr = (ElfW(Ehdr) *)file; ehdr = (ElfW(Ehdr) *)file;
if (memcmp(ehdr->e_ident, "\177ELF", 4) != 0) { 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 * Huh? Maybe filename was overridden by setproctitle() and
* it match non-elf file. * it match non-elf file.
*/ */
close(fd);
goto fail; goto fail;
} }
obj->fd = fd;
obj->mapped = file; obj->mapped = file;
obj->mapped_size = (size_t)filesize; obj->mapped_size = (size_t)filesize;
@ -790,9 +787,8 @@ next_line:
while (obj) { while (obj) {
obj_info_t *o = obj; obj_info_t *o = obj;
obj = o->next; obj = o->next;
if (o->fd) { if (o->mapped_size) {
munmap(o->mapped, o->mapped_size); munmap(o->mapped, o->mapped_size);
close(o->fd);
} }
free(o); free(o);
} }