#!/usr/bin/perl # # raceForward # # An example program vulnerable to multiple race conditions. # # Copyright 2002, Bri Hatch # # Released under the GPL. See COPYING file # for more information. # # ($username, $email) = @ARGV; $FILE = "/home/$username/.forward"; # Get user info ($uid,$gid) = (getpwnam($username))[2,3] or die "No such user $username"; # Check to see if file is in good shape. if ( ($fileuid) = (stat $FILE)[4] ) { unless ( $fileuid == $uid ) { die "Something is amiss with ${username}'s .forward."; } } else { # Make sure it's not a dangling symlink too! if ( ($fileuid) = (lstat $FILE)[4] ) { die "Whoa - dangling symlink! Trickery suspected!" } } # Race condition - what if file was changed # between the tests above and this open? open FORWARD, ">$FILE" or die; print FORWARD "$email\n"; close FORWARD; # More race conditions - what if file opened above # is changed before chown or chmod? chown $uid,$gid, $FILE or warn "Whoa, can't chown it." chmod 0600, $FILE or warn "Can't chmod the file."