[PATCH] Fix addseverity
Jakub Jelinek
jakub@redhat.com
Tue Jan 25 22:13:00 GMT 2005
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
More information about the Libc-hacker
mailing list