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] |
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] |