about summary refs log tree commit diff
path: root/dlfcn/dlerror.c
diff options
context:
space:
mode:
authorUlrich Drepper <drepper@redhat.com>2000-07-13 19:46:27 +0000
committerUlrich Drepper <drepper@redhat.com>2000-07-13 19:46:27 +0000
commitca3c01356495ebfbb315c2984dda8eba88467597 (patch)
tree1a39c90278b0888a0f10ab83526912c977bcbc81 /dlfcn/dlerror.c
parentaa4068f2945ff0b263d9fc6342c39767bf723327 (diff)
downloadglibc-ca3c01356495ebfbb315c2984dda8eba88467597.tar.gz
glibc-ca3c01356495ebfbb315c2984dda8eba88467597.tar.xz
glibc-ca3c01356495ebfbb315c2984dda8eba88467597.zip
Update.
	* elf/Versions (ld): Export _dl_out_of_memory for GLIBC_2.2.
	* dlfcn/dlerror.c (dlerror): Don't free the error string if it is the
	report that we are out of memory.
	* elf/dl-deps.c (_dl_map_object_deps): Likewise.
	* elf/dl-libc.c (dlerror_run): Likewise.
	* elf/dl-open.c (_dl_open): Likewise.
	* elf/rtld.c (dl_main): Likewise.
	* elf/dl-error.c: Define _dl_out_of_memory.
	(_dl_signal_error): Return _dl_signal_error if we cannot duplicate
	the error string.
	* sysdeps/generic/ldsodefs.h: Declare _dl_out_of_memory.

	* dlfcn/dlerror.c (free_key_mem): Also free error string.

	* iconv/loop.c: Fix comment.
Diffstat (limited to 'dlfcn/dlerror.c')
-rw-r--r--dlfcn/dlerror.c16
1 files changed, 12 insertions, 4 deletions
diff --git a/dlfcn/dlerror.c b/dlfcn/dlerror.c
index 34ea82907e..1650eca729 100644
--- a/dlfcn/dlerror.c
+++ b/dlfcn/dlerror.c
@@ -35,7 +35,6 @@ struct dl_action_result
 static struct dl_action_result last_result;
 static struct dl_action_result *static_buf;
 
-
 /* This is the key for the thread specific memory.  */
 static __libc_key_t key;
 
@@ -61,7 +60,8 @@ dlerror (void)
       /* We can now free the string.  */
       if (result->errstring != NULL)
 	{
-	  free ((char *) result->errstring);
+	  if (strcmp (result->errstring, "out of memory") != 0)
+	    free ((char *) result->errstring);
 	  result->errstring = NULL;
 	}
       buf = NULL;
@@ -75,7 +75,8 @@ dlerror (void)
 			 strerror (result->errcode)) != -1)
 	{
 	  /* We don't need the error string anymore.  */
-	  free ((char *) result->errstring);
+	  if (strcmp (result->errstring, "out of memory") != 0)
+	    free ((char *) result->errstring);
 	  result->errstring = buf;
 	}
 
@@ -123,7 +124,8 @@ _dlerror_run (void (*operate) (void *), void *args)
     {
       /* Free the error string from the last failed command.  This can
 	 happen if `dlerror' was not run after an error was found.  */
-      free ((char *) result->errstring);
+      if (strcmp (result->errstring, "out of memory") != 0)
+	free ((char *) result->errstring);
       result->errstring = NULL;
     }
 
@@ -153,6 +155,12 @@ init (void)
 static void
 free_key_mem (void *mem)
 {
+  struct dl_action_result *result = (struct dl_action_result *) mem;
+
+  if (result->errstring != NULL
+      && strcmp (result->errstring, "out of memory") != 0)
+    free (result->errstring);
+
   free (mem);
   __libc_setspecific (key, NULL);
 }