From d1804166ad8a4bf5e932ee792c46ea8ecc78a0e6 Mon Sep 17 00:00:00 2001 From: pcanterino <> Date: Sat, 8 Jan 2005 10:18:18 +0000 Subject: [PATCH 1/1] - NOW check_path() should work properly I removed my self-written code to resolve "..", "...", "...." and so on and replaced it by a single call to abs_path(). That is more reliable! - file_name() and upper_path() now take care of a "multiple-slash-root-directory" and Windows drive letters --- modules/Tool.pm | 27 +++++---------------------- 1 file changed, 5 insertions(+), 22 deletions(-) diff --git a/modules/Tool.pm b/modules/Tool.pm index 9ba39c2..1f72b75 100644 --- a/modules/Tool.pm +++ b/modules/Tool.pm @@ -6,7 +6,7 @@ package Tool; # Some shared sub routines # # Author: Patrick Canterino -# Last modified: 2005-01-07 +# Last modified: 2005-01-08 # use strict; @@ -66,28 +66,11 @@ sub check_path($$) my $last = file_name($path); $last = '' if($last eq '.'); - if($last eq '..') + if($last eq '..' || ($^O eq 'MSWin32' && $last =~ m!^\.\.\.+$!)) { - $first = upper_path($first); + $first = abs_path($first.'/'.$last); $last = ''; } - elsif($^O eq 'MSWin32' && $last =~ m!^\.\.\.+$!) - { - # Windows allows to go upwards in a path using things like - # "..." and "...." and so on - - my $count = length($last)-1; - - for(my $x=0;$x<$count;$x++) - { - unless($first =~ m!^[a-z]{1}:(/|\\)$!i) - { - $first = upper_path($first); - } - } - - $last = ''; - } $path = File::Spec->canonpath($first.'/'.$last); @@ -240,7 +223,7 @@ sub file_name($) my $path = shift; $path =~ tr!\\!/!; - unless($path eq '/') + unless($path =~ m!^/+$! || ($^O eq 'MSWin32' && $path =~ m!^[a-z]:/+$!)) { $path =~ s!/+$!!; $path = substr($path,rindex($path,'/')+1); @@ -300,7 +283,7 @@ sub upper_path($) my $path = shift; $path =~ tr!\\!/!; - unless($path eq '/') + unless($path =~ m!^/+$! || ($^O eq 'MSWin32' && $path =~ m!^[a-z]:/+$!)) { $path =~ s!/+$!!; $path = substr($path,0,rindex($path,'/')+1); -- 2.34.1