summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorunknown <df@kahlann.erinye.com>2006-11-24 15:36:04 +0100
committerunknown <df@kahlann.erinye.com>2006-11-24 15:36:04 +0100
commit6de6b97eeed6db587d1c856178262d7ead396a9b (patch)
tree8d39df120051aa69492d35d8a449b323e69c3fba
parentc3d6927d58b32af1ec3bcd33bdad7b7b6d02ddd0 (diff)
downloadmariadb-git-6de6b97eeed6db587d1c856178262d7ead396a9b.tar.gz
fixes for mtr_unique.pl
mysql-test/lib/mtr_unique.pl: - add info message to mtr_require_unique_id_and_wait as suggested - fix for security issue - locks for pids of processes that don't exist anymore are reused, if ps is present and working as expected
-rw-r--r--mysql-test/lib/mtr_unique.pl43
1 files changed, 40 insertions, 3 deletions
diff --git a/mysql-test/lib/mtr_unique.pl b/mysql-test/lib/mtr_unique.pl
index 9bf86e26f4f..a8fb320c773 100644
--- a/mysql-test/lib/mtr_unique.pl
+++ b/mysql-test/lib/mtr_unique.pl
@@ -35,6 +35,13 @@ sub mtr_require_unique_id($$$) {
my $min = shift;
my $max = shift;
my $ret = undef;
+ my $changed = 0;
+
+ my $can_use_ps = `ps -e | grep '^[ ]*$$ '`;
+
+ if(eval("readlink '$file'") || eval("readlink '$file.sem'")) {
+ die 'lock file is a symbolic link';
+ }
chmod 0777, "$file.sem";
open SEM, ">", "$file.sem" or die "can't write to $file.sem";
@@ -43,6 +50,11 @@ sub mtr_require_unique_id($$$) {
open FILE, ">", $file or die "can't create $file";
close FILE;
}
+
+ if(eval("readlink '$file'") || eval("readlink '$file.sem'")) {
+ die 'lock file is a symbolic link';
+ }
+
chmod 0777, $file;
open FILE, "+<", $file or die "can't open $file";
select undef,undef,undef,0.2;
@@ -52,15 +64,30 @@ sub mtr_require_unique_id($$$) {
chomp;
my ($id, $pid) = split / /;
$taken{$id} = $pid;
+ if($can_use_ps) {
+ my $res = `ps -e | grep '^[ ]*$pid '`;
+ if(!$res) {
+ print "Ignoring slot $id used by missing process $pid.\n";
+ delete $taken{$id};
+ ++$changed;
+ }
+ }
}
- seek FILE, 0, 2;
for(my $i=$min; $i<=$max; ++$i) {
if(! exists $taken{$i}) {
- print FILE "$i $$\n";
$ret = $i;
+ $taken{$i} = $$;
+ ++$changed;
last;
}
}
+ if($changed) {
+ seek FILE, 0, 0;
+ truncate FILE, 0 or die "can't truncate $file";
+ for my $k (keys %taken) {
+ print FILE $k . ' ' . $taken{$k} . "\n";
+ }
+ }
close FILE;
flock SEM, LOCK_UN or warn "can't unlock $file.sem";
close SEM;
@@ -75,8 +102,9 @@ sub mtr_require_unique_id($$$) {
sub mtr_require_unique_id_and_wait($$$) {
my $ret = mtr_require_unique_id($_[0],$_[1],$_[2]);
while(! defined $ret) {
- sleep 10;
+ sleep 30;
$ret = mtr_require_unique_id($_[0],$_[1],$_[2]);
+ print "Waiting for unique id to become available...\n" unless $ret;
}
return $ret;
}
@@ -88,8 +116,17 @@ sub mtr_release_unique_id($$) {
my $file = shift;
my $myid = shift;
+ if(eval("readlink '$file'") || eval("readlink '$file.sem'")) {
+ die 'lock file is a symbolic link';
+ }
+
open SEM, ">", "$file.sem" or die "can't write to $file.sem";
flock SEM, LOCK_EX or die "can't lock $file.sem";
+
+ if(eval("readlink '$file'") || eval("readlink '$file.sem'")) {
+ die 'lock file is a symbolic link';
+ }
+
if(! -e $file) {
open FILE, ">", $file or die "can't create $file";
close FILE;