+2008-10-03  Paul Pluzhnikov  <ppluzhnikov@google.com>
+       
+       * utils.c, defs.h (gdb_buildargv): New fn. Wrap buildargv
+       and check for out-of-memory condition.
+       * exec.c (exec_file_command): Call it.
+       * infrun.c (handle_command, xdb_handle_command): Likewise.
+       * interps.c (interpreter_exec_cmd): Likewise.
+       * linux-nat.c (linux_nat_info_proc_cmd): Likewise.
+       * procfs.c (info_proc_cmd): Likewise.
+       * remote-mips.c (common_open): Likewise.
+       * remote-sim.c (gdbsim_kill, gdbsim_create_inferior)
+       (gdbsim_open): Likewise.
+       * remote.c (extended_remote_run, remote_put_command)
+       (remote_get_command, remote_delete_command): Likewise.
+       * ser-mingw.c (pipe_windows_open): Likesise.
+       * source.c (add_path, show_substitute_path_command)
+       (unset_substitute_path_command, set_substitute_path_command):
+       Likewise.
+       * stack.c (backtrace_command): Likewise.
+       * symfile.c (symbol_file_command, generic_load)
+       (add_symbol_file_command): Likesise.
+       * symmisc.c (maintenance_print_symbols, maintenance_print_psymbols)
+       (maintenance_print_msymbols): Likewise.
+
 2008-10-02  Jan Kratochvil  <jan.kratochvil@redhat.com>
 
        Replace TYPE_ARRAY_{UPPER,LOWER}_BOUND_TYPE by a bit if {un,}defined.
 
 
 char *ldirname (const char *filename);
 
+char **gdb_buildargv (const char *);
+
 /* From demangle.c */
 
 extern void set_demangling_style (char *);
 
       /* Scan through the args and pick up the first non option arg
          as the filename.  */
 
-      argv = buildargv (args);
-      if (argv == NULL)
-        nomem (0);
-
+      argv = gdb_buildargv (args);
       make_cleanup_freeargv (argv);
 
       for (; (*argv != NULL) && (**argv == '-'); argv++)
 
 
   /* Break the command line up into args. */
 
-  argv = buildargv (args);
-  if (argv == NULL)
-    {
-      nomem (0);
-    }
+  argv = gdb_buildargv (args);
   old_chain = make_cleanup_freeargv (argv);
 
   /* Walk through the args, looking for signal oursigs, signal names, and
   char **argv;
   struct cleanup *old_chain;
 
+  if (args == NULL)
+    error_no_arg (_("xdb command"));
+
   /* Break the command line up into args. */
 
-  argv = buildargv (args);
-  if (argv == NULL)
-    {
-      nomem (0);
-    }
+  argv = gdb_buildargv (args);
   old_chain = make_cleanup_freeargv (argv);
   if (argv[1] != (char *) NULL)
     {
 
   unsigned int i;
   int old_quiet, use_quiet;
 
-  prules = buildargv (args);
-  if (prules == NULL)
-    {
-      error (_("unable to parse arguments"));
-    }
+  if (args == NULL)
+    error_no_arg (_("interpreter-exec command"));
+
+  prules = gdb_buildargv (args);
+  make_cleanup_freeargv (prules);
 
   nrules = 0;
-  if (prules != NULL)
-    {
-      for (trule = prules; *trule != NULL; trule++)
-       {
-         nrules++;
-       }
-    }
+  for (trule = prules; *trule != NULL; trule++)
+    nrules++;
 
   if (nrules < 2)
     error (_("usage: interpreter-exec <interpreter> [ <command> ... ]"));
 
   if (args)
     {
       /* Break up 'args' into an argv array.  */
-      if ((argv = buildargv (args)) == NULL)
-       nomem (0);
-      else
-       make_cleanup_freeargv (argv);
+      argv = gdb_buildargv (args);
+      make_cleanup_freeargv (argv);
     }
   while (argv != NULL && *argv != NULL)
     {
 
   old_chain = make_cleanup (null_cleanup, 0);
   if (args)
     {
-      if ((argv = buildargv (args)) == NULL)
-       nomem (0);
-      else
-       make_cleanup_freeargv (argv);
+      argv = gdb_buildargv (args);
+      make_cleanup_freeargv (argv);
     }
   while (argv != NULL && *argv != NULL)
     {
 
 
   /* Parse the serial port name, the optional TFTP name, and the
      optional local TFTP name.  */
-  if ((argv = buildargv (name)) == NULL)
-    nomem (0);
+  argv = gdb_buildargv (name);
   make_cleanup_freeargv (argv);
 
   serial_port_name = xstrdup (argv[0]);
 
 static void
 gdbsim_load (char *args, int fromtty)
 {
-  char **argv = buildargv (args);
+  char **argv;
   char *prog;
 
-  if (argv == NULL)
-    nomem (0);
+  if (args == NULL)
+      error_no_arg (_("program to load"));
 
+  argv = gdb_buildargv (args);
   make_cleanup_freeargv (argv);
 
   prog = tilde_expand (argv[0]);
       strcat (arg_buf, exec_file);
       strcat (arg_buf, " ");
       strcat (arg_buf, args);
-      argv = buildargv (arg_buf);
+      argv = gdb_buildargv (arg_buf);
       make_cleanup_freeargv (argv);
     }
   else
       strcat (arg_buf, " ");   /* 1 */
       strcat (arg_buf, args);
     }
-  argv = buildargv (arg_buf);
-  if (argv == NULL)
-    error (_("Insufficient memory available to allocate simulator arg list."));
+  argv = gdb_buildargv (arg_buf);
   make_cleanup_freeargv (argv);
 
   init_callbacks ();
 
     error (_("Remote file name too long for run packet"));
   len += 2 * bin2hex ((gdb_byte *) remote_exec_file, rs->buf + len, 0);
 
+  gdb_assert (args != NULL);
   if (*args)
     {
       struct cleanup *back_to;
       int i;
       char **argv;
 
-      argv = buildargv (args);
+      argv = gdb_buildargv (args);
       back_to = make_cleanup ((void (*) (void *)) freeargv, argv);
       for (i = 0; argv[i] != NULL; i++)
        {
   struct cleanup *back_to;
   char **argv;
 
-  argv = buildargv (args);
-  if (argv == NULL)
-    nomem (0);
+  if (args == NULL)
+    error_no_arg (_("file to put"));
+
+  argv = gdb_buildargv (args);
   back_to = make_cleanup_freeargv (argv);
   if (argv[0] == NULL || argv[1] == NULL || argv[2] != NULL)
     error (_("Invalid parameters to remote put"));
   struct cleanup *back_to;
   char **argv;
 
-  argv = buildargv (args);
-  if (argv == NULL)
-    nomem (0);
+  if (args == NULL)
+    error_no_arg (_("file to get"));
+
+  argv = gdb_buildargv (args);
   back_to = make_cleanup_freeargv (argv);
   if (argv[0] == NULL || argv[1] == NULL || argv[2] != NULL)
     error (_("Invalid parameters to remote get"));
   struct cleanup *back_to;
   char **argv;
 
-  argv = buildargv (args);
-  if (argv == NULL)
-    nomem (0);
+  if (args == NULL)
+    error_no_arg (_("file to delete"));
+
+  argv = gdb_buildargv (args);
   back_to = make_cleanup_freeargv (argv);
   if (argv[0] == NULL || argv[1] != NULL)
     error (_("Invalid parameters to remote delete"));
 
   struct pipe_state *ps;
   FILE *pex_stderr;
 
-  char **argv = buildargv (name);
+  if (name == NULL)
+    error_no_arg (_("child command"));
+
+  char **argv = gdb_buildargv (name);
   struct cleanup *back_to = make_cleanup_freeargv (argv);
+
   if (! argv[0] || argv[0][0] == '\0')
     error ("missing child command");
 
-
   ps = make_pipe_state ();
   make_cleanup (cleanup_pipe_state, ps);
 
 
       /* This will properly parse the space and tab separators
         and any quotes that may exist. DIRNAME_SEPARATOR will
         be dealt with later.  */
-      argv = buildargv (dirname);
+      argv = gdb_buildargv (dirname);
       make_cleanup_freeargv (argv);
 
-      if (argv == NULL)
-       nomem (0);
-
       arg = argv[0];
     }
   else
   char **argv;
   char *from = NULL;
   
-  argv = buildargv (args);
+  argv = gdb_buildargv (args);
   make_cleanup_freeargv (argv);
 
   /* We expect zero or one argument.  */
 unset_substitute_path_command (char *args, int from_tty)
 {
   struct substitute_path_rule *rule = substitute_path_rules;
-  char **argv = buildargv (args);
+  char **argv = gdb_buildargv (args);
   char *from = NULL;
   int rule_found = 0;
 
   char **argv;
   struct substitute_path_rule *rule;
   
-  argv = buildargv (args);
+  argv = gdb_buildargv (args);
   make_cleanup_freeargv (argv);
 
   if (argv == NULL || argv[0] == NULL || argv [1] == NULL)
 
       char **argv;
       int i;
 
-      argv = buildargv (arg);
+      argv = gdb_buildargv (arg);
       old_chain = make_cleanup_freeargv (argv);
       argc = 0;
       for (i = 0; argv[i]; i++)
 
     }
   else
     {
-      char **argv = buildargv (args);
+      char **argv = gdb_buildargv (args);
       int flags = OBJF_USERLOADED;
       struct cleanup *cleanups;
       char *name = NULL;
 
-      if (argv == NULL)
-       nomem (0);
-
       cleanups = make_cleanup_freeargv (argv);
       while (*argv != NULL)
        {
 
   make_cleanup (clear_memory_write_data, &cbdata.requests);
 
-  argv = buildargv (args);
-
-  if (argv == NULL)
-    nomem(0);
+  if (args == NULL)
+    error_no_arg (_("file to load"));
 
+  argv = gdb_buildargv (args);
   make_cleanup_freeargv (argv);
 
   filename = tilde_expand (argv[0]);
   if (args == NULL)
     error (_("add-symbol-file takes a file name and an address"));
 
-  argv = buildargv (args);
+  argv = gdb_buildargv (args);
   make_cleanup_freeargv (argv);
 
-  if (argv == NULL)
-    nomem (0);
-
   for (arg = argv[0], argcnt = 0; arg != NULL; arg = argv[++argcnt])
     {
       /* Process the argument. */
 
       error (_("\
 Arguments missing: an output file name and an optional symbol file name"));
     }
-  else if ((argv = buildargv (args)) == NULL)
-    {
-      nomem (0);
-    }
+  argv = gdb_buildargv (args);
   cleanups = make_cleanup_freeargv (argv);
 
   if (argv[0] != NULL)
     {
       error (_("print-psymbols takes an output file name and optional symbol file name"));
     }
-  else if ((argv = buildargv (args)) == NULL)
-    {
-      nomem (0);
-    }
+  argv = gdb_buildargv (args);
   cleanups = make_cleanup_freeargv (argv);
 
   if (argv[0] != NULL)
     {
       error (_("print-msymbols takes an output file name and optional symbol file name"));
     }
-  else if ((argv = buildargv (args)) == NULL)
-    {
-      nomem (0);
-    }
+  argv = gdb_buildargv (args);
   cleanups = make_cleanup_freeargv (argv);
 
   if (argv[0] != NULL)
 
   dirname[base - filename] = '\0';
   return dirname;
 }
+
+/* Call libiberty's buildargv, and return the result.
+   If buildargv fails due to out-of-memory, call nomem.
+   Therefore, the returned value is guaranteed to be non-NULL,
+   unless the parameter itself is NULL.  */
+
+char **
+gdb_buildargv (const char *s)
+{
+  char **argv = buildargv (s);
+  if (s != NULL && argv == NULL)
+    nomem (0);
+  return argv;
+}