Andrew Dunstan wrote: > Martijn van Oosterhout wrote: > > Just a minor thing. In yesno_prompt(), the value is resp is allocated > > memory that is never freed. > > > > File: src/bin/scripts/common.c > > Line: 218 > > > > Not terribly important though, it's not used in critical utilities, but > > it's used often. > > > > Found by coverity. > > > > It is surely not the only memory leak. We know there are some and in > most cases (like this) they aren't worth the trouble to clean up. If it > were used in psql or the backend I'd be worried, but it isn't, so I'm not.
I have applied the attached patch to fix this. One reason I think it is good to fix this is because it illustrates poor use of simple_prompt(), that might be copied by others. -- Bruce Momjian [EMAIL PROTECTED] EnterpriseDB http://www.enterprisedb.com + If your life is a hard drive, Christ can be your backup. +
Index: src/bin/scripts/common.c =================================================================== RCS file: /cvsroot/pgsql/src/bin/scripts/common.c,v retrieving revision 1.22 diff -c -c -r1.22 common.c *** src/bin/scripts/common.c 22 Sep 2006 19:51:14 -0000 1.22 --- src/bin/scripts/common.c 3 Oct 2006 21:40:52 -0000 *************** *** 208,227 **** { char prompt[256]; for (;;) { char *resp; - /* translator: This is a question followed by the translated options for "yes" and "no". */ - snprintf(prompt, sizeof(prompt), _("%s (%s/%s) "), - _(question), _(PG_YESLETTER), _(PG_NOLETTER)); resp = simple_prompt(prompt, 1, true); if (strcmp(resp, _(PG_YESLETTER)) == 0) return true; else if (strcmp(resp, _(PG_NOLETTER)) == 0) return false; printf(_("Please answer \"%s\" or \"%s\".\n"), _(PG_YESLETTER), _(PG_NOLETTER)); } --- 208,235 ---- { char prompt[256]; + /* translator: This is a question followed by the translated options for "yes" and "no". */ + snprintf(prompt, sizeof(prompt), _("%s (%s/%s) "), + _(question), _(PG_YESLETTER), _(PG_NOLETTER)); + for (;;) { char *resp; resp = simple_prompt(prompt, 1, true); if (strcmp(resp, _(PG_YESLETTER)) == 0) + { + free(resp); return true; + } else if (strcmp(resp, _(PG_NOLETTER)) == 0) + { + free(resp); return false; + } + free(resp); printf(_("Please answer \"%s\" or \"%s\".\n"), _(PG_YESLETTER), _(PG_NOLETTER)); }
---------------------------(end of broadcast)--------------------------- TIP 5: don't forget to increase your free space map settings