Index: wp-admin/includes/file.php
===================================================================
--- wp-admin/includes/file.php	(revision 13162)
+++ wp-admin/includes/file.php	(working copy)
@@ -528,10 +528,13 @@
 		}
 	}
 
-	if ( class_exists('ZipArchive') && apply_filters('unzip_file_use_ziparchive', true ) )
-		return _unzip_file_ziparchive($file, $to, $needed_dirs);
-	else
-		return _unzip_file_pclzip($file, $to, $needed_dirs);
+	if ( class_exists('ZipArchive') && apply_filters('unzip_file_use_ziparchive', true ) ) {
+		$result = _unzip_file_ziparchive($file, $to, $needed_dirs);
+		if ( $result ) // true || WP_Error 
+			return $result;
+	}
+	// Fall through to PclZip if ZipArchive is not available, or encountered an error opening the file.
+	return _unzip_file_pclzip($file, $to, $needed_dirs);
 }
 
 /**
@@ -545,7 +548,7 @@
  * @param string $file Full path and filename of zip archive
  * @param string $to Full path on the filesystem to extract archive to
  * @param array $needed_dirs A partial list of required folders needed to be created.
- * @return mixed WP_Error on failure, True on success
+ * @return mixed WP_Error|false}true WP_Error for failure codes, false if the archive could not be read, true for success.
  */
 function _unzip_file_ziparchive($file, $to, $needed_dirs = array() ) {
 	global $wp_filesystem;
@@ -554,7 +557,7 @@
 
 	// PHP4-compat - php4 classes can't contain constants
 	if ( true !== $z->open($file, /* ZIPARCHIVE::CHECKCONS */ 4) )
-		return new WP_Error('incompatible_archive', __('Incompatible Archive.'));
+		return false;
 
 	for ( $i = 0; $i < $z->numFiles; $i++ ) {
 		if ( ! $info = $z->statIndex($i) )
@@ -591,6 +594,8 @@
 			return new WP_Error('copy_failed', __('Could not copy file.'), $to . $file['filename']);
 	}
 
+	$z->close();
+
 	return true;
 }
 
