From: Jacob Bachmeyer Date: Thu, 20 Oct 2022 23:52:08 +0000 (-0500) Subject: Factor version check into separate block in interpret_directive X-Git-Url: https://vcs.fsf.org/?a=commitdiff_plain;h=a67003e2f2e215831398bef07f96523ab90710a2;p=gatekeeper.git Factor version check into separate block in interpret_directive Produced messages are changed; the testsuite is adjusted accordingly. --- diff --git a/gatekeeper.pl b/gatekeeper.pl index be190c2..f9282f3 100755 --- a/gatekeeper.pl +++ b/gatekeeper.pl @@ -1379,6 +1379,27 @@ sub interpret_directive { my $filename; my $cnt = 0; # TODO: remove this + { # Extract version first, since directive elements may be in any order. + my @versions = grep $_->[0] eq 'version', @$directive; + + if (scalar @versions == 1) { + $versions[0][1] =~ /^(\d+\.\d+)$/ + or fatal("invalid version $versions[0][1]",1,$directive_file_contents); + my $val = $1; # so far so good + + # We only support version 1.1/1.2 right now! + fatal("invalid version $val, not supported",1,$directive_file_contents) + if (($val ne '1.1') and ($val ne '1.2')); + + $header{version} = $val; # TODO: parse? + $info{"version"} = $val; #ok. + } elsif (scalar @versions > 1) { + fatal("invalid multiple version elements",1,$directive_file_contents); + } else { # no version at all; no longer allowed + # This will be caught later, when the operation list is validated. + } + } + foreach my $item (@$directive) { my $tainted_cmd = lc $item->[0]; my $tainted_val = $item->[1]; @@ -1401,21 +1422,7 @@ sub interpret_directive { $filename = $val; $info{"filename"} = {"value" => $val, "order" => $cnt++}; # ok. } elsif ($tainted_cmd eq 'version') { - $tainted_val =~ /^(\d+\.\d+)$/ - or fatal("invalid version $tainted_val",1,$directive_file_contents); - my $val = $1; # so far so good - - # We only support version 1.1/1.2 right now! - fatal("invalid version $val, not supported",1,$directive_file_contents) - if (($val ne '1.1') and ($val ne '1.2')); - - # Only let them specify one version directive. - fatal("invalid second version $val, have $info{version}", - 1,$directive_file_contents) - if exists $info{"version"}; - - $header{version} = $val; # TODO: parse? - $info{"version"} = $val; #ok. + # already handled above } elsif ($tainted_cmd eq 'symlink') { $tainted_val =~ /^($RE_filename_relative)\s+($RE_filename_relative)$/ or fatal("invalid parameters for symlink command: $tainted_val", diff --git a/testsuite/lib/gatekeeper.exp b/testsuite/lib/gatekeeper.exp index 1fb59d7..ff6d7c2 100644 --- a/testsuite/lib/gatekeeper.exp +++ b/testsuite/lib/gatekeeper.exp @@ -679,7 +679,7 @@ proc analyze_log { base_dir name assess } { exp_continue } -re {^gatekeeper\[[0-9]+\]: \(Test\)\ - invalid second version ([^,]+), have ([^\r\n]+)} { + invalid multiple version elements} { # from read_directive_file, if version repeated set A(validate,bad-version-repeat) 1 exp_continue