use IO::Handle;
use Carp;
use Digest::SHA;
+use File::FnMatch qw(:fnmatch);
BEGIN {
use Exporter ();
target_core_dump_setup
sha256file host_shared_mark_ready
gitcache_setup
+
+ @accessible_runvar_pats
);
%EXPORT_TAGS = ( );
our $logm_handle= new IO::File ">& STDERR" or die $!;
our $logm_prefix= '';
+# When runvar_access_restrict is called, it will limit reading
+# of non-synth runvars to ones which match these glob patterns.
+our @accessible_runvar_pats = qw(test-host-setup-runvars-will-appear-here);
+
#---------- test script startup ----------
sub tsreadconfig () {
'home-osstest-gitconfig');
}
+sub runvar_access_restrict () {
+ # restricts runvars to those in @accessible_runvar_pats
+ return if "@accessible_runvar_pats" eq "*";
+ return if tied %r;
+ tie %r, 'RunvarMonitor', %r;
+}
+
+sub runvar_access_check ($$) {
+ my ($key, $what) = @_;
+ return if grep { fnmatch $_, $key } @accessible_runvar_pats;
+ my $m = "reuse-uncontrolled runvar $what '$key'\n".
+ " (controlled runvars are @accessible_runvar_pats)";
+ confess $m unless $ENV{OSSTEST_UNCONTROLLED_SHARE_RUNVAR_WARNONLY};
+ Carp::cluck $m;
+}
+
+package RunvarMonitor;
+use Carp;
+use Osstest;
+use Osstest::TestSupport;
+
+sub TIEHASH {
+ my $self = shift;
+ logm("reuse: restricting runvars to @accessible_runvar_pats");
+ return bless { @_ }, $self;
+}
+
+sub _ok {
+ my $self = shift;
+ my $key = shift;
+ Osstest::TestSupport::runvar_access_check($key, 'access');
+}
+
+sub FIRSTKEY {
+ confess
+ "reuse-uncontrolled runvar scanning - change to use runvar_glob!";
+}
+sub FETCH { my ($self, $key) = @_; $self->_ok($key); $self->{$key} }
+sub EXISTS { my ($self, $key) = @_; $self->_ok($key); exists $self->{$key} }
+sub STORE { my ($self, $key, $val) = @_; $self->{$key} = $val; }
+sub DELETE { my ($self, $key) = @_; delete $self->{$key}; }
+
+sub CLEAR { confess }
+sub SCALAR { confess }
+sub UNTIE { confess }
+
1;