Module Name: src Committed By: rillig Date: Mon Dec 13 05:25:04 UTC 2021
Modified Files: src/usr.bin/make: main.c make.h parse.c str.c str.h Log Message: make: fix memory leak for filenames in .for loops (since 2013-06-18) Previously, each time a .for directive pushed its buffer on the input file stack, the current filename was duplicated. This was a waste of memory. The name of a file is typically only used while it is read in. There is one situation when the filename is needed for longer, which is when a target is defined. Since .for loops are implemented as a special form of included files, each .for loop duplicated the current filename as well. $ cat << EOF > for.mk .for i in 1 2 3 4 5 6 7 8 9 0 .for i in 1 2 3 4 5 6 7 8 9 0 .for i in 1 2 3 4 5 6 7 8 9 0 .for i in 1 2 3 4 5 6 7 8 9 0 .for i in 1 2 3 4 5 6 7 8 9 0 .for i in 1 2 3 4 5 6 7 8 9 0 .for i in 1 2 3 4 5 6 7 8 9 0 .endfor .endfor .endfor .endfor .endfor .endfor .endfor all: @ps -o rsz -p ${.MAKE.PID} EOF $ make-2021.12.13.03.55.16 -r -f for.mk RSZ 10720 $ ./make -r -f for.mk RSZ 1716 The difference is 8 MB, which amounts to 1 million .for loops. To generate a diff of this commit: cvs rdiff -u -r1.541 -r1.542 src/usr.bin/make/main.c cvs rdiff -u -r1.270 -r1.271 src/usr.bin/make/make.h cvs rdiff -u -r1.575 -r1.576 src/usr.bin/make/parse.c cvs rdiff -u -r1.86 -r1.87 src/usr.bin/make/str.c cvs rdiff -u -r1.13 -r1.14 src/usr.bin/make/str.h Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.