Add an extra level of race avoidance.
authorIain Patterson <me@iain.cx>
Fri, 15 Apr 2011 15:10:16 +0000 (16:10 +0100)
committerIain Patterson <me@iain.cx>
Thu, 25 Aug 2011 10:05:08 +0000 (11:05 +0100)
Checking for a kinit child can introduce a race.

opt/bin/ktmux_helper

index 0e48ad4..e2b58a5 100755 (executable)
@@ -35,6 +35,8 @@ my $klist = $opts{'L'} || "klist";
 my $krenew = $opts{'R'} || "krenew";
 my $tmux = $opts{'T'} || "tmux";
 
+my $avoid_race = 0;
+
 my $exitasap = 0;
 my $pid = 0;
 
@@ -111,9 +113,12 @@ sub check_credentials {
 
 # We were signalled by our child which noticed that our credentials expired.
 sub want_credentials {
+  return sleep 1 if $avoid_race;
+  $avoid_race = 1;
   # Do we already know?
-  return sleep 1 if &check_kinit_child;
-  system $tmux, "new-window", "-n", "Renew Kerberos credentials", "exec $kinit";
+  system $tmux, "new-window", "-n", "Renew Kerberos credentials", "exec $kinit" unless &check_kinit_child;
+  sleep 1;
+  $avoid_race = 0;
 }
 
 sub cleanup {