Article View: gnu.utils.bug
Article #1272Make-3.62 rules bug (with fix)
From: Jay Schuster
Date: Thu, 07 Jan 1993 16:23
Date: Thu, 07 Jan 1993 16:23
162 lines
5003 bytes
5003 bytes
Make-3.62 was dumping core on me with a complicated Makefile
on an IBM RS/6000 running IBM AIX 3.2. In tracing it down,
a problem similar to that that I had with vpath was happenning
when rules were being deleted out of the list.
There was also a problem with my earlier vpath fix, in that it
referenced vpath->next when vpath may have just been free()'d.
(This was also a problem with the existing rule.c code).
This patch incorporates the vpath fix I posted yesterday, along
with a fix to it, and the fix to the rule.c.
--- ./rule.c~ Wed Jan 6 18:11:39 1993
+++ ./rule.c Thu Jan 7 11:21:28 1993
@@ -65,13 +65,14 @@
{
char *name;
unsigned int namelen;
- register struct rule *rule, *lastrule;
+ register struct rule *rule, *lastrule, *nextrule;
num_pattern_rules = 0;
name = 0;
namelen = 0;
- rule = lastrule = pattern_rules;
+ rule = pattern_rules;
+ lastrule = NULL;
while (rule != 0)
{
unsigned int ndeps = 0;
@@ -108,7 +109,8 @@
{
if (*name == '/')
{
- freerule (rule, lastrule);
+ nextrule = rule->next;
+ freerule (rule, lastrule, 1);
rule = lastrule;
goto end_main_loop;
}
@@ -121,9 +123,11 @@
if (ndeps > max_pattern_deps)
max_pattern_deps = ndeps;
+ nextrule = rule->next;
+
end_main_loop:;
lastrule = rule;
- rule = rule->next;
+ rule = nextrule;
}
if (name != 0)
@@ -251,7 +255,7 @@
rule->next = 0;
/* Search for an identical rule. */
- lastrule = pattern_rules;
+ lastrule = NULL;
for (r = pattern_rules; r != 0; lastrule = r, r = r->next)
for (i = 0; rule->targets[i] != 0; ++i)
for (j = 0; r->targets[j] != 0; ++j)
@@ -267,7 +271,7 @@
if (override)
{
/* Remove the old rule. */
- freerule (r, lastrule);
+ freerule (r, lastrule, 1);
/* Install the new one. */
if (pattern_rules == 0)
pattern_rules = rule;
@@ -281,7 +285,7 @@
else
{
/* The old rule stays intact. Destroy the new one. */
- freerule (rule, (struct rule *) 0);
+ freerule (rule, (struct rule *) 0, 0);
return 0;
}
}
@@ -357,11 +361,14 @@
/* Free all the storage used in RULE and take it out of the
pattern_rules chain. LASTRULE is the rule whose next pointer
- points to RULE. */
+ points to RULE. DELETE should be zero to prevent the deletion
+ of RULE from the pattern_rules list (in which case LASTRULE is
+ ignored) */
static void
-freerule (rule, lastrule)
+freerule (rule, lastrule, delete)
register struct rule *rule, *lastrule;
+ int delete;
{
struct rule *next = rule->next;
register unsigned int i;
@@ -386,14 +393,11 @@
free ((char *) rule);
- if (lastrule == 0)
+ if (!delete)
return;
- if (pattern_rules == rule)
- if (lastrule != pattern_rules)
- abort ();
- else
- pattern_rules = next;
+ if (lastrule == 0)
+ pattern_rules = next;
else
lastrule->next = next;
if (last_pattern_rule == rule)
--- ./vpath.c~ Wed Jan 6 18:11:39 1993
+++ ./vpath.c Thu Jan 7 10:57:22 1993
@@ -122,10 +122,11 @@
if (dirpath == 0)
{
/* Remove matching listings. */
- register struct vpath *path, *lastpath;
+ register struct vpath *path, *lastpath, *nextpath;
- lastpath = vpaths;
- for (path = vpaths; path != 0; lastpath = path, path = path->next)
+ lastpath = NULL;
+ path = vpaths;
+ while (path != 0)
if (pattern == 0
|| (((percent == 0 && path->percent == 0)
|| (percent - pattern == path->percent - path->pattern))
@@ -132,15 +133,22 @@
&& streq (pattern, path->pattern)))
{
/* Remove it from the linked list. */
- if (lastpath == vpaths)
- vpaths = path->next;
+ nextpath = path->next;
+ if (lastpath == NULL)
+ vpaths = nextpath;
else
- lastpath->next = path->next;
+ lastpath->next = nextpath;
/* Free its unused storage. */
free (path->pattern);
free ((char *) path->searchpath);
free ((char *) path);
+ path = nextpath;
+ }
+ else
+ {
+ lastpath = path;
+ path = path->next;
}
if (pattern != 0)
free (pattern);
--
Jay Schuster <jay@pcc.COM> uunet!uvm-gen!banzai!jay, attmail!banzai!jay
The People's Computer Company `Revolutionary Programming'
Technical Details
Message-ID:
<C0Hs0G.KEx@banzai.PCC.COM>Path:
arc1-ca.pugleaf.net!sparky!uunet!zaphod.mps.ohio-state.edu!cis.ohio-state.edu!banzai.pcc.COM!jayShow Full Headers
Complete Article Headers
Newsgroups: gnu.utils.bug Path: arc1-ca.pugleaf.net!sparky!uunet!zaphod.mps.ohio-state.edu!cis.ohio-state.edu!banzai.pcc.COM!jay From: jay@banzai.pcc.COM (Jay Schuster) Subject: Make-3.62 rules bug (with fix) Message-ID: <C0Hs0G.KEx@banzai.PCC.COM> Summary: singly linked list deletion code incorrect Sender: gnulists@ai.mit.edu Organization: The People's Computer Company, Williston, VT Distribution: gnu Date: Thu, 7 Jan 1993 16:23:44 GMT Approved: bug-gnu-utils@prep.ai.mit.edu Lines: 163