This is the mail archive of the
libc-alpha@sourceware.org
mailing list for the glibc project.
Re: [PATCH] [BZ 17460] "nscd --help" crashes with segmentation fault on 32-bit machine
- From: Roland McGrath <roland at hack dot frob dot com>
- To: Mikel Rychliski <mikel at mikelr dot com>
- Cc: libc-alpha at sourceware dot org
- Date: Wed, 8 Oct 2014 15:39:13 -0700 (PDT)
- Subject: Re: [PATCH] [BZ 17460] "nscd --help" crashes with segmentation fault on 32-bit machine
- Authentication-results: sourceware.org; auth=none
- References: <5432F805 dot 7090801 at mikelr dot com>
Thanks for the report and the patch. I fixed it a different way, shown
below. For something not even slightly performance-critical, it is easier
and less error prone to use lots of dynamic allocation rather than to
calculate the size precisely.
Thanks,
Roland
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.
--- a/nscd/nscd.c
+++ b/nscd/nscd.c
@@ -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;
--- a/nscd/nscd_conf.c
+++ b/nscd/nscd_conf.c
@@ -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] =