diff --git src/wp-admin/includes/class-wp-upgrader.php src/wp-admin/includes/class-wp-upgrader.php
index 6ee7684c35..a2687b0a02 100644
--- src/wp-admin/includes/class-wp-upgrader.php
+++ src/wp-admin/includes/class-wp-upgrader.php
@@ -343,23 +343,23 @@ class WP_Upgrader {
 		$unwritable_files = array();
 
 		$_files = $wp_filesystem->dirlist( $remote_destination, true, true );
+		$_flat_files = array();
 
-		// Flatten the resulting array, iterate using each as we append to the array during iteration.
-		while ( $f = each( $_files ) ) {
-			$file = $f['value'];
-			$name = $f['key'];
+		// @TODO needs testing:
 
+		// Flatten the resulting array.
+		foreach ( $_files as $name => $file ) {
 			if ( ! isset( $file['files'] ) ) {
 				continue;
 			}
 
 			foreach ( $file['files'] as $filename => $details ) {
-				$_files[ $name . '/' . $filename ] = $details;
+				$_flat_files[ $name . '/' . $filename ] = $details;
 			}
 		}
 
 		// Check writability.
-		foreach ( $_files as $filename => $file_details ) {
+		foreach ( $_flat_files as $filename => $file_details ) {
 			if ( ! $wp_filesystem->is_writable( $remote_destination . $filename ) ) {
 
 				// Attempt to alter permissions to allow writes and try again.
