commit 44eb2088299f10d45a1b3950285c3314217e0f44 from: Russ Cox date: Thu Aug 27 00:36:40 2015 UTC mk: avoid infinite loop when targets are repeated Fixes "mk -f /tmp/x.mk y x" or "mk -f /tmp/x.mk" where /tmp/x.mk is: x y x: f echo hi Change-Id: I7fa87dc4750c04fdba010b990c190722b432b333 Reviewed-on: https://plan9port-review.googlesource.com/1361 Reviewed-by: Russ Cox commit - 775cb933ecea6361717ef1def27b5d9e90c385fd commit + 44eb2088299f10d45a1b3950285c3314217e0f44 blob - a40e9ded8078ffe24f17e9b41830f41c191d87fc blob + ca14e9d6729ffdb77b96be00973af3f5e5f8af5c --- src/cmd/mk/mk.h +++ src/cmd/mk/mk.h @@ -109,6 +109,7 @@ typedef struct Node #define NORECIPE 0x0400 #define DELETE 0x0800 #define NOMINUSE 0x1000 +#define ONLIST 0x2000 typedef struct Job { blob - 7993e091b69c77a7de0c30a28e0670ce4a1796cd blob + 60325198981883364247b0bccec90ece6975ff46 --- src/cmd/mk/recipe.c +++ src/cmd/mk/recipe.c @@ -70,10 +70,15 @@ dorecipe(Node *node) ww->next = newword(buf); ww = ww->next; if(n == node) continue; + if((n->flags&ONLIST) != 0) + continue; + n->flags |= ONLIST; n->next = node->next; node->next = n; } } + for(n = node->next; n; n = n->next) + n->flags &= ~ONLIST; for(n = node; n; n = n->next) if((n->flags&READY) == 0) return(did);