diff options
author | Ulrich Drepper <drepper@redhat.com> | 2001-11-07 07:44:06 +0000 |
---|---|---|
committer | Ulrich Drepper <drepper@redhat.com> | 2001-11-07 07:44:06 +0000 |
commit | fb0356b9d6471b69e0160edacb13845762b2c510 (patch) | |
tree | d9b951afc41106624b14d780ab3f20423c9edef7 /elf/dl-load.c | |
parent | bd3916e8fb78089adb44cdc7ec8b737e11a9a0d6 (diff) | |
download | glibc-fb0356b9d6471b69e0160edacb13845762b2c510.tar.gz glibc-fb0356b9d6471b69e0160edacb13845762b2c510.tar.xz glibc-fb0356b9d6471b69e0160edacb13845762b2c510.zip |
Update.
2001-11-06 Ulrich Drepper <drepper@redhat.com> * elf/dl-load.c (_dl_map_object_from_fd): Don't call _dl_signal_error directly, always use lose. Set fd to -1 after file is closed. (lose): Don't call close if fd == -1.
Diffstat (limited to 'elf/dl-load.c')
-rw-r--r-- | elf/dl-load.c | 23 |
1 files changed, 11 insertions, 12 deletions
diff --git a/elf/dl-load.c b/elf/dl-load.c index 421a72dfc2..60e7d2e869 100644 --- a/elf/dl-load.c +++ b/elf/dl-load.c @@ -749,7 +749,9 @@ lose (int code, int fd, const char *name, char *realname, struct link_map *l, which use `alloca'. */ int *a = alloca (sizeof (int)); a[0] = fd; - (void) __close (a[0]); + /* The file might already be closed. */ + if (a[0] != -1) + (void) __close (a[0]); if (l != NULL) { /* Remove the stillborn object from the list and free it. */ @@ -921,8 +923,7 @@ _dl_map_object_from_fd (const char *name, int fd, struct filebuf *fbp, c->mapoff = ph->p_offset & ~(ph->p_align - 1); /* Optimize a common case. */ - if ((PF_R | PF_W | PF_X) == 7 - && (PROT_READ | PROT_WRITE | PROT_EXEC) == 7) + if ((PF_R | PF_W | PF_X) == 7) c->prot = _dl_pf_to_prot[ph->p_flags & (PF_R | PF_W | PF_X)]; else { @@ -1099,6 +1100,8 @@ _dl_map_object_from_fd (const char *name, int fd, struct filebuf *fbp, /* We are done mapping in the file. We no longer need the descriptor. */ __close (fd); + /* Signal that we closed the file. */ + fd = -1; if (l->l_type == lt_library && type == ET_EXEC) l->l_type = lt_executable; @@ -1155,8 +1158,8 @@ _dl_map_object_from_fd (const char *name, int fd, struct filebuf *fbp, free (l); - _dl_signal_error (0, name, NULL, - N_("shared object cannot be dlopen()ed")); + errstring = N_("shared object cannot be dlopen()ed"); + goto call_lose; } if (l->l_info[DT_HASH]) @@ -1227,13 +1230,9 @@ print_search_path (struct r_search_path_elem **list, cp[0] = '\0'; else cp[-1] = '\0'; - if (first) - { - _dl_debug_printf_c ("%s", buf); - first = 0; - } - else - _dl_debug_printf_c (":%s", buf); + + _dl_debug_printf_c (first ? "%s" : ":%s", buf); + first = 0; } ++list; |