diff mbox

[BZ,17460] "nscd --help" crashes with segmentation fault on 32-bit machine

Message ID 20141008223913.D5F012C3AC3@topped-with-meat.com
State New
Headers show

Commit Message

Roland McGrath Oct. 8, 2014, 10:39 p.m. UTC
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.
diff mbox

Patch

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