BZ#17460: Fix buffer overrun in nscd --help.

This commit is contained in:
Roland McGrath 2014-10-08 15:36:12 -07:00
parent 7b8fb2b8db
commit c763c5d271
4 changed files with 33 additions and 25 deletions

View File

@ -1,3 +1,11 @@
2014-10-08 Roland McGrath <roland@hack.frob.com>
[BZ #17460]
* nscd/nscd.c (more_help): Rewrite list of tables collection
using xstrdup and asprintf.
* nscd/nscd_conf.c: Remove local xstrdup declaration.
2014-10-08 Kostya Serebryany <konstantin.s.serebryany@gmail.com> 2014-10-08 Kostya Serebryany <konstantin.s.serebryany@gmail.com>
Roland McGrath <roland@hack.frob.com> Roland McGrath <roland@hack.frob.com>

2
NEWS
View File

@ -9,7 +9,7 @@ Version 2.21
* The following bugs are resolved with this release: * The following bugs are resolved with this release:
6652, 14171, 17266, 17363, 17370, 17371, 17411. 6652, 14171, 17266, 17363, 17370, 17371, 17411, 17460.
Version 2.20 Version 2.20

View File

@ -451,33 +451,36 @@ parse_opt (int key, char *arg, struct argp_state *state)
static char * static char *
more_help (int key, const char *text, void *input) more_help (int key, const char *text, void *input)
{ {
char *tables, *tp = NULL;
switch (key) switch (key)
{ {
case ARGP_KEY_HELP_EXTRA: case ARGP_KEY_HELP_EXTRA:
{ {
dbtype cnt; /* We print some extra information. */
tables = xmalloc (sizeof (dbnames) + 1); char *tables = xstrdup (dbnames[0]);
for (cnt = 0; cnt < lastdb; cnt++) for (dbtype i = 1; i < lastdb; ++i)
{ {
strcat (tables, dbnames[cnt]); char *more_tables;
strcat (tables, " "); if (asprintf (&more_tables, "%s %s", tables, dbnames[i]) < 0)
more_tables = NULL;
free (tables);
if (more_tables == NULL)
return NULL;
tables = more_tables;
} }
}
/* We print some extra information. */ char *tp;
if (asprintf (&tp, gettext ("\ if (asprintf (&tp, gettext ("\
Supported tables:\n\ Supported tables:\n\
%s\n\ %s\n\
\n\ \n\
For bug reporting instructions, please see:\n\ For bug reporting instructions, please see:\n\
%s.\n\ %s.\n\
"), tables, REPORT_BUGS_TO) < 0) "), tables, REPORT_BUGS_TO) < 0)
tp = NULL; tp = NULL;
free (tables); free (tables);
return tp; return tp;
}
default: default:
break; break;
@ -622,15 +625,15 @@ monitor_child (int fd)
} }
if (WIFEXITED (status)) if (WIFEXITED (status))
{ {
child_ret = WEXITSTATUS (status); child_ret = WEXITSTATUS (status);
fprintf (stderr, _("child exited with status %d\n"), child_ret); fprintf (stderr, _("child exited with status %d\n"), child_ret);
} }
if (WIFSIGNALED (status)) if (WIFSIGNALED (status))
{ {
child_ret = WTERMSIG (status); child_ret = WTERMSIG (status);
fprintf (stderr, _("child terminated by signal %d\n"), child_ret); fprintf (stderr, _("child terminated by signal %d\n"), child_ret);
} }
} }
/* We have the child status, so exit with that code. */ /* We have the child status, so exit with that code. */

View File

@ -32,9 +32,6 @@
#include "dbg_log.h" #include "dbg_log.h"
#include "nscd.h" #include "nscd.h"
/* Wrapper functions with error checking for standard functions. */
extern char *xstrdup (const char *s);
/* Names of the databases. */ /* Names of the databases. */
const char *const dbnames[lastdb] = const char *const dbnames[lastdb] =