summaryrefslogtreecommitdiffstats
path: root/ldap/admin/src/scripts/Util.pm.in
diff options
context:
space:
mode:
Diffstat (limited to 'ldap/admin/src/scripts/Util.pm.in')
-rw-r--r--ldap/admin/src/scripts/Util.pm.in18
1 files changed, 14 insertions, 4 deletions
diff --git a/ldap/admin/src/scripts/Util.pm.in b/ldap/admin/src/scripts/Util.pm.in
index b6e3e0ea..ad7347ed 100644
--- a/ldap/admin/src/scripts/Util.pm.in
+++ b/ldap/admin/src/scripts/Util.pm.in
@@ -697,6 +697,7 @@ sub addSuffix {
sub process_maptbl
{
my ($mapper, $errs, @infdata) = @_;
+ my @deferredkeys = ();
if (defined($mapper->{""})) {
$mapper = $mapper->{""}; # side effect of Inf with no sections
@@ -712,10 +713,7 @@ sub process_maptbl
}
elsif ($value =~ /^\`/)
{
- $value =~ tr/\`//d; # value is a perl expression to eval
- my $returnvalue; # set in eval expression
- eval $value;
- $mapper->{$key} = $returnvalue; # perl expression sets $returnvalue
+ push @deferredkeys, $key; # process these last
}
else
{
@@ -751,6 +749,18 @@ sub process_maptbl
}
}
}
+
+ # we have to process the perl expressions to eval last, because those
+ # expressions may use mappings defined elsewhere in the file, and we are not
+ # guaranteed of the order in which hash keys are enumerated
+ foreach my $key (@deferredkeys) {
+ my $value = $mapper->{$key};
+ $value =~ tr/\`//d; # value is a perl expression to eval
+ my $returnvalue; # set in eval expression
+ eval $value;
+ $mapper->{$key} = $returnvalue; # perl expression sets $returnvalue
+ }
+
return $mapper;
}