Make sure to assign a boolean value to a 1-bit bitfield. Reported on
authorPaul Smith <psmith@gnu.org>
Mon, 26 Sep 2005 05:16:31 +0000 (05:16 +0000)
committerPaul Smith <psmith@gnu.org>
Mon, 26 Sep 2005 05:16:31 +0000 (05:16 +0000)
the bug-make mailing list.

Fix Savannah bug # 14527: remember to free temporary line constructor
memory if the line is empty.

ChangeLog
job.c
variable.c

index d2e47e97d9f4ca0b6958756529d77754adea373a..83e1fa802405d716406edf56f45ee393fff34984 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,15 @@
+2005-09-26  Paul D. Smith  <psmith@gnu.org>
+
+       * job.c (construct_command_argv_internal): If the line is empty
+       remember to free the temporary argv strings.
+       Fixes bug # 14527.
+
+2005-09-16  Paul D. Smith  <psmith@gnu.org>
+
+       * job.c (start_job_command): The noerror flag is a boolean (single
+       bit); set it appropriately.
+       Reported by Mark Eichin <eichin@metacarta.com>
+
 2005-08-29  Paul D. Smith  <psmith@gnu.org>
 
        * function.c (func_error): On Windows, output from $(info ...)
diff --git a/job.c b/job.c
index 18d17e30de450912a729aad8081f1a8a946e7d22..71bc3814ff8e24b6b8198e51fb51c7244d16ae77 100644 (file)
--- a/job.c
+++ b/job.c
@@ -987,7 +987,7 @@ start_job_command (struct child *child)
           | child->file->cmds->lines_flags[child->command_line - 1]);
 
   p = child->command_ptr;
-  child->noerror = flags & COMMANDS_NOERROR;
+  child->noerror = ((flags & COMMANDS_NOERROR) != 0);
 
   while (*p != '\0')
     {
@@ -2298,6 +2298,7 @@ construct_command_argv_internal (char *line, char **restp, char *shell,
   char *end;
   int instring, word_has_equals, seen_nonequals, last_argument_was_empty;
   char **new_argv = 0;
+  char *argstr = 0;
 #ifdef WINDOWS32
   int slow_flag = 0;
 
@@ -2384,7 +2385,7 @@ construct_command_argv_internal (char *line, char **restp, char *shell,
   new_argv = (char **) xmalloc (i * sizeof (char *));
 
   /* All the args can fit in a buffer as big as LINE is.   */
-  ap = new_argv[0] = (char *) xmalloc (i);
+  ap = new_argv[0] = argstr = (char *) xmalloc (i);
   end = ap + i;
 
   /* I is how many complete arguments have been found.  */
@@ -2598,8 +2599,12 @@ construct_command_argv_internal (char *line, char **restp, char *shell,
     }
 
   if (new_argv[0] == 0)
-    /* Line was empty.  */
-    return 0;
+    {
+      /* Line was empty.  */
+      free (argstr);
+      free ((char *)new_argv);
+      return 0;
+    }
 
   return new_argv;
 
@@ -2609,8 +2614,8 @@ construct_command_argv_internal (char *line, char **restp, char *shell,
   if (new_argv != 0)
     {
       /* Free the old argument list we were working on.  */
-      free (new_argv[0]);
-      free ((void *)new_argv);
+      free (argstr);
+      free ((char *)new_argv);
     }
 
 #ifdef __MSDOS__
index 2f1826f32e0170a6ba3eeaf2b218ad46332f444f..43964a59fa721551629ed9ac43ba89fde4da9581 100644 (file)
@@ -446,7 +446,7 @@ lookup_variable_in_set (const char *name, unsigned int length,
 void
 initialize_file_variables (struct file *file, int reading)
 {
-  register struct variable_set_list *l = file->variables;
+  struct variable_set_list *l = file->variables;
 
   if (l == 0)
     {