This is the mail archive of the libc-hacker@sources.redhat.com mailing list for the glibc project.

Note that libc-hacker is a closed list. You may look at the archives of this list, but subscription and posting are not open.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[PATCH] Fix addseverity


Hi!

As the testcase below shows, the right fix for addseverity is not
removing the free call in internal_addseverity, but to use new_string
that addseverity computes for exactly that purpose.  Otherwise, we leak
memory and if the string passed to addseverity is freed by the caller,
we still reference freed up memory, or if the string passed to addseverity
is overwritten, we use whatever it was overwritten to.

2005-01-25  Jakub Jelinek  <jakub@redhat.com>

	* stdlib/fmtmsg.c (internal_addseverity): Revert 2005-01-14 change.
	(addseverity): Pass new_string instead of string to internal_addseverity.
	* stdlib/tst-fmtmsg.c: Include string.h.
	(main): Add some more tests.

--- libc/stdlib/tst-fmtmsg.c.jj	2005-01-19 14:13:03.000000000 +0100
+++ libc/stdlib/tst-fmtmsg.c	2005-01-25 23:03:49.864872564 +0100
@@ -1,6 +1,7 @@
 #include <fmtmsg.h>
 #include <mcheck.h>
 #include <stdio.h>
+#include <string.h>
 
 
 #define MM_TEST 10
@@ -12,11 +13,13 @@ main (void)
 
   mtrace ();
 
-  if (addseverity (MM_TEST, "TEST") != MM_OK)
+  char TEST[] = "TEST";
+  if (addseverity (MM_TEST, TEST) != MM_OK)
     {
       puts ("addseverity failed");
       result = 1;
     }
+  strcpy (TEST, "ABCD");
 
   if (fmtmsg (MM_PRINT, "GLIBC:tst-fmtmsg", MM_HALT, "halt",
 	      "should print message for MM_HALT", "GLIBC:tst-fmtmsg:1")
@@ -54,5 +57,25 @@ main (void)
       result = 1;
     }
 
+  if (addseverity (MM_TEST, NULL) != MM_NOTOK)
+    {
+      puts ("third addseverity unexpectedly succeeded");
+      result = 1;
+    }
+
+  char *p = strdup ("TEST2");
+  if (addseverity (MM_TEST, p) != MM_OK)
+    {
+      puts ("fourth addseverity failed");
+      result = 1;
+    }
+  free (p);
+
+  if (addseverity (MM_TEST, "TEST3") != MM_OK)
+    {
+      puts ("fifth addseverity failed");
+      result = 1;
+    }
+
   return result;
 }
--- libc/stdlib/fmtmsg.c.jj	2005-01-25 22:30:23.000000000 +0100
+++ libc/stdlib/fmtmsg.c	2005-01-25 22:51:47.558972441 +0100
@@ -316,7 +316,7 @@ internal_addseverity (int severity, cons
   int result = MM_OK;
 
   /* First see if there is already a record for the severity level.  */
-  for (runp = severity_list, lastp = NULL; runp != NULL; runp = runp-> next)
+  for (runp = severity_list, lastp = NULL; runp != NULL; runp = runp->next)
     if (runp->severity == severity)
       break;
     else
@@ -324,6 +324,9 @@ internal_addseverity (int severity, cons
 
   if (runp != NULL)
     {
+      /* Release old string.  */
+      free ((char *) runp->string);
+
       if (string != NULL)
 	/* Change the string.  */
 	runp->string = string;
@@ -386,7 +389,7 @@ addseverity (int severity, const char *s
   __libc_lock_lock (lock);
 
   /* Do the real work.  */
-  result = internal_addseverity (severity, string);
+  result = internal_addseverity (severity, new_string);
 
   if (result != MM_OK)
     /* Free the allocated string.  */

	Jakub


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]