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>
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:
6652, 14171, 17266, 17363, 17370, 17371, 17411.
6652, 14171, 17266, 17363, 17370, 17371, 17411, 17460.
Version 2.20

View File

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

View File

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