Update.
authorUlrich Drepper <drepper@redhat.com>
Wed, 7 Nov 2001 07:44:06 +0000 (07:44 +0000)
committerUlrich Drepper <drepper@redhat.com>
Wed, 7 Nov 2001 07:44:06 +0000 (07:44 +0000)
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.

ChangeLog
elf/dl-load.c

index 59e422a0caed2f348235b9a08f2e3f7f88e60364..916b8156cf3302147e36a50f42ebc9e95f0d942e 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,10 @@
+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.
+
 2001-11-07  Kaoru Fukui  <k_fukui@highway.ne.jp>
 
        * manual/charset.texi: Fix typo @w[ISO 6937] to  @w{ISO 6937}.
index 421a72dfc2517228bcb91942fecc7c690639efaf..60e7d2e869e7c7d7234c8304e5e4f82cfc43f36e 100644 (file)
@@ -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;