diff options
author | Richard Levitte <levitte@openssl.org> | 2020-05-05 16:53:43 +0200 |
---|---|---|
committer | Richard Levitte <levitte@openssl.org> | 2020-05-06 20:16:25 +0200 |
commit | 4975e8b4d2cfab923d522840533334a1bbd754b8 (patch) | |
tree | 7b9101a2b0e5cf204aa6b932ec3f62b68fa23bf1 /Configure | |
parent | edbb56ee4fafc07eb77747ad25278a04b89adc09 (diff) | |
download | openssl-4975e8b4d2cfab923d522840533334a1bbd754b8.zip openssl-4975e8b4d2cfab923d522840533334a1bbd754b8.tar.gz openssl-4975e8b4d2cfab923d522840533334a1bbd754b8.tar.bz2 |
Configure: avoid perl regexp bugs
It seems that in older perl versions '(?P' doesn't interact very well
with '(?|' or '(?:'.
Since we make extensive use of '(?P' in build.info parsing, we avoid
combining that with '(?|' and '(?:' when parsing build.info variables,
and end up parsing variable modifier twice (first generally, and then
parse that result into the modifier components).
Fixes #11694
Reviewed-by: Matt Caswell <matt@openssl.org>
(Merged from https://github.com/openssl/openssl/pull/11737)
Diffstat (limited to 'Configure')
-rwxr-xr-x | Configure | 58 |
1 files changed, 26 insertions, 32 deletions
@@ -1831,23 +1831,13 @@ if ($builder eq "unified") { my $variable_name_re = qr/(?P<VARIABLE>[[:alpha:]][[:alnum:]_]*)/; # Value modifier syntaxes my $variable_subst_re = qr/\/(?P<RE>(?:\\\/|.)*?)\/(?P<SUBST>.*?)/; - # Put it all together - my $variable_re = qr/\$ - (?| - # Simple case, just the name - ${variable_name_re} - | - # Expressive case, with braces and possible - # modifier expressions - \{ - ${variable_name_re} - (?: - # Pile on modifier expressions, - # separated by | - ${variable_subst_re} - ) - \} - )/x; + # Variable reference + my $variable_simple_re = qr/(?<!\\)\$${variable_name_re}/; + my $variable_w_mod_re = + qr/(?<!\\)\$\{${variable_name_re}(?P<MOD>(?:\\\/|.)*?)\}/; + # Tie it all together + my $variable_re = qr/${variable_simple_re}|${variable_w_mod_re}/; + my $expand_variables = sub { my $value = ''; my $value_rest = shift; @@ -1856,25 +1846,29 @@ if ($builder eq "unified") { print STDERR "DEBUG[\$expand_variables] Parsed '$value_rest' ...\n" } - while ($value_rest =~ /(?<!\\)${variable_re}/) { - $value_rest = $'; - $value .= $`; + while ($value_rest =~ /${variable_re}/) { + # We must save important regexp values, because the next + # regexp clears them + my $mod = $+{MOD}; my $variable_value = $variables{$+{VARIABLE}}; + $value_rest = $'; + $value .= $`; + # Process modifier expressions, if present - if (defined $+{RE}) { - # We must save important %+ values, because the s/// - # below clears them - my $re = $+{RE}; - my $subst = $+{SUBST}; - - $variable_value =~ s/\Q$re\E/$subst/g; - - if ($ENV{CONFIGURE_DEBUG_VARIABLE_EXPAND}) { - print STDERR - "DEBUG[\$expand_variables] ... and substituted ", - "'$re' with '$subst'\n"; + if (defined $mod) { + if ($mod =~ /^${variable_subst_re}$/) { + my $re = $+{RE}; + my $subst = $+{SUBST}; + + $variable_value =~ s/\Q$re\E/$subst/g; + + if ($ENV{CONFIGURE_DEBUG_VARIABLE_EXPAND}) { + print STDERR + "DEBUG[\$expand_variables] ... and substituted ", + "'$re' with '$subst'\n"; + } } } |