web/wp-admin/includes/class-wp-filesystem-base.php
changeset 204 09a1c134465b
parent 194 32102edaa81b
--- a/web/wp-admin/includes/class-wp-filesystem-base.php	Wed Dec 19 12:35:13 2012 -0800
+++ b/web/wp-admin/includes/class-wp-filesystem-base.php	Wed Dec 19 17:46:52 2012 -0800
@@ -193,12 +193,13 @@
 		$folder = untrailingslashit($folder);
 
 		$folder_parts = explode('/', $folder);
-		$last_path = $folder_parts[ count($folder_parts) - 1 ];
+		$last_index = array_pop( array_keys( $folder_parts ) );
+		$last_path = $folder_parts[ $last_index ];
 
 		$files = $this->dirlist( $base );
 
-		foreach ( $folder_parts as $key ) {
-			if ( $key == $last_path )
+		foreach ( $folder_parts as $index => $key ) {
+			if ( $index == $last_index )
 				continue; //We want this to be caught by the next code block.
 
 			//Working from /home/ to /user/ to /wordpress/ see if that file exists within the current folder,
@@ -210,7 +211,9 @@
 				$newdir = trailingslashit(path_join($base, $key));
 				if ( $this->verbose )
 					printf( __('Changing to %s') . '<br/>', $newdir );
-				if ( $ret = $this->search_for_folder( $folder, $newdir, $loop) )
+				// only search for the remaining path tokens in the directory, not the full path again
+				$newfolder = implode( '/', array_slice( $folder_parts, $index + 1 ) );
+				if ( $ret = $this->search_for_folder( $newfolder, $newdir, $loop) )
 					return $ret;
 			}
 		}
@@ -304,14 +307,14 @@
 		   if ($key = array_search($attarray[$i], $legal))
 			   $realmode .= $legal[$key];
 
-		$mode = str_pad($realmode, 9, '-');
+		$mode = str_pad($realmode, 10, '-', STR_PAD_LEFT);
 		$trans = array('-'=>'0', 'r'=>'4', 'w'=>'2', 'x'=>'1');
 		$mode = strtr($mode,$trans);
 
-		$newmode = '';
-		$newmode .= $mode[0] + $mode[1] + $mode[2];
-		$newmode .= $mode[3] + $mode[4] + $mode[5];
-		$newmode .= $mode[6] + $mode[7] + $mode[8];
+		$newmode = $mode[0];
+		$newmode .= $mode[1] + $mode[2] + $mode[3];
+		$newmode .= $mode[4] + $mode[5] + $mode[6];
+		$newmode .= $mode[7] + $mode[8] + $mode[9];
 		return $newmode;
 	}