Hello, with the build 819 from ActivePerl I recently received the error
Directory //phchbs-w26786/wsdisk/tmp/a changed before chdir, aborting at ... when I try to remove a directory tree using an UNC path. I peeked into File::Path and saw that the routine checks for a race condition "where a directory may be replaced by a symlink between the initial lstat and the chdir". This fails always for UNC paths as after doing the chdir the stat yields a device number of -1 (it would not fail if one would start from an UNC path as the cwd but that is probably rarely the case ... ;-) ). This can be reproduced by the small program below. The drive z: mounts the share //phchbs-w26786/wsdisk. Removing the $dDir works, that of $uDir fails. #!perl -w use strict; use File::Path; use Cwd 'getcwd'; my $dDir = 'z:/tmp/a'; my $uDir = '//phchbs-w26786/wsdisk/tmp/a'; my $dir = $uDir; my $oldpwd = getcwd or die $!; my ($dev, $ino, $perm) = lstat $dir; print "dev $dev, ino $ino, perm $perm\n"; chdir $dir or die $!; my ($new_dev, $new_ino) = stat '.'; print "new_dev $new_dev, new_ino $new_ino\n"; chdir $oldpwd or die $!; rmtree($dir,1,1) or die $!; For now I found a solution by patching my version of Path.pm in the following way: --- Path.pm.orig 2006-01-04 08:55:28.000000000 +0100 +++ Path.pm 2007-02-13 19:10:47.534437500 +0100 @@ -205,8 +205,10 @@ # avoid a race condition where a directory may be replaced by a # symlink between the initial lstat and the chdir + my $pathIsUNC = $path =~ m|^[/\\]{2}| ? 1 : 0; my ($new_dev, $new_ino) = stat '.'; - unless ("$new_dev:$new_ino" eq "$dev:$ino") + unless ( ( $new_ino == $ino ) && + ( ($new_dev == $dev) || ( ($new_dev == -1) && $pathIsUNC) ) ) { croak "Directory $prefix$path changed before chdir, aborting"; } Would that be a reasonable way to account for UNC paths? It seems to work fine. Ekkehard _________________________ CONFIDENTIALITY NOTICE The information contained in this e-mail message is intended only for the exclusive use of the individual or entity named above and may contain information that is privileged, confidential or exempt from disclosure under applicable law. If the reader of this message is not the intended recipient, or the employee or agent responsible for delivery of the message to the intended recipient, you are hereby notified that any dissemination, distribution or copying of this communication is strictly prohibited. If you have received this communication in error, please notify the sender immediately by e-mail and delete the material from any computer. Thank you.
_______________________________________________ Perl-Win32-Users mailing list Perl-Win32-Users@listserv.ActiveState.com To unsubscribe: http://listserv.ActiveState.com/mailman/mysubs