From 745109e4233cfa31b801fded36ef749ffb709d0e Mon Sep 17 00:00:00 2001 From: Andrew Johnson Date: Thu, 22 Jun 2017 18:38:07 -0500 Subject: [PATCH] Add loop detection to Release.pm GNUmake will *usually* spot recursive "include" loops first, but not if the loop is in another module that we're just checking. In that case Release.pm eats file descriptors until they run out without this fix. --- src/tools/EPICS/Release.pm | 24 ++++++++++++++++-------- 1 file changed, 16 insertions(+), 8 deletions(-) diff --git a/src/tools/EPICS/Release.pm b/src/tools/EPICS/Release.pm index ab12076b0..bceed2ed7 100644 --- a/src/tools/EPICS/Release.pm +++ b/src/tools/EPICS/Release.pm @@ -17,22 +17,24 @@ sub readReleaseFiles { $Rmacros->{'EPICS_HOST_ARCH'} = $hostarch if $hostarch; return unless (-e $relfile); - &readRelease($relfile, $Rmacros, $Rapps); + + my %done; + &readRelease($relfile, $Rmacros, $Rapps, \%done); if ($hostarch) { my $hrelfile = "$relfile.$hostarch"; - &readRelease($hrelfile, $Rmacros, $Rapps) if (-e $hrelfile); + &readRelease($hrelfile, $Rmacros, $Rapps, \%done) if (-e $hrelfile); $hrelfile .= '.Common'; - &readRelease($hrelfile, $Rmacros, $Rapps) if (-e $hrelfile); + &readRelease($hrelfile, $Rmacros, $Rapps, \%done) if (-e $hrelfile); } if ($arch) { my $crelfile = "$relfile.Common.$arch"; - &readRelease($crelfile, $Rmacros, $Rapps) if (-e $crelfile); + &readRelease($crelfile, $Rmacros, $Rapps, \%done) if (-e $crelfile); if ($hostarch) { my $arelfile = "$relfile.$hostarch.$arch"; - &readRelease($arelfile, $Rmacros, $Rapps) if (-e $arelfile); + &readRelease($arelfile, $Rmacros, $Rapps, \%done) if (-e $arelfile); } } } @@ -41,10 +43,16 @@ sub readReleaseFiles { # Parse a configure/RELEASE* file and anything it includes # sub readRelease { - my ($file, $Rmacros, $Rapps) = @_; - # $Rmacros is a reference to a hash, $Rapps a ref to an array + my ($file, $Rmacros, $Rapps, $Rdone) = @_; + # $Rmacros and $Rdone are hash-refs, $Rapps an array-ref + + if (exists $Rdone->{$file}) { + die "Release.pm: Recursive loop found in RELEASE files,\n" . + "discovered in $file\n"; + } open(my $IN, '<', $file) or croak "Can't open $file: $!\n"; + $Rdone->{$file}++; while (<$IN>) { chomp; s/ \r $//x; # Shouldn't need this, but sometimes... @@ -69,7 +77,7 @@ sub readRelease { my ($op, $path) = m/^ \s* (-? include) \s+ (.*)/x; $path = expandMacros($path, $Rmacros); if (-e $path) { - &readRelease($path, $Rmacros, $Rapps); + &readRelease($path, $Rmacros, $Rapps, $Rdone); } elsif ($op eq "include") { carp "EPICS/Release.pm: Include file '$path' not found\n"; }