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

Reply via email to