On Tue, 2013-07-09 at 14:20 -0400, Martin d'Anjou wrote:
> I have found a segmentation fault executing make. This makefile makes
> little sense, but it reproduces the segfault:

Thanks for the report.  I've pushed a fix for this fault.  You can use
the attached patch to try the fix yourself.

Cheers!

diff --git a/implicit.c b/implicit.c
index 97233a6..6d2e09b 100644
--- a/implicit.c
+++ b/implicit.c
@@ -217,8 +217,8 @@ pattern_search (struct file *file, int archive,
   struct file *int_file = 0;
 
   /* List of dependencies found recursively.  */
-  struct patdeps *deplist
-    = xmalloc (max_pattern_deps * sizeof (struct patdeps));
+  unsigned int max_deps = max_pattern_deps;
+  struct patdeps *deplist = xmalloc (max_deps * sizeof (struct patdeps));
   struct patdeps *pat = deplist;
 
   /* Names of possible dependencies are constructed in this buffer.  */
@@ -651,13 +651,15 @@ pattern_search (struct file *file, int archive,
               /* If there are more than max_pattern_deps prerequisites (due to
                  2nd expansion), reset it and realloc the arrays.  */
 
-              if (deps_found > max_pattern_deps)
+              if (deps_found > max_deps)
                 {
                   unsigned int l = pat - deplist;
+                  /* This might have changed due to recursion.  */
+                  max_pattern_deps = MAX(max_pattern_deps, deps_found);
+                  max_deps = max_pattern_deps;
                   deplist = xrealloc (deplist,
-                                      deps_found * sizeof (struct patdeps));
+                                      max_deps * sizeof (struct patdeps));
                   pat = deplist + l;
-                  max_pattern_deps = deps_found;
                 }
 
               /* Go through the nameseq and handle each as a prereq name.  */
@@ -757,8 +759,8 @@ pattern_search (struct file *file, int archive,
                           pat->pattern = int_file->name;
                           int_file->name = d->name;
                           pat->file = int_file;
-                          (pat++)->name = d->name;
                           int_file = 0;
+                          (pat++)->name = d->name;
                           continue;
                         }
 
_______________________________________________
Help-make mailing list
[email protected]
https://lists.gnu.org/mailman/listinfo/help-make

Reply via email to