From d95707a358c0aed912ec8bdf7319266cdcaff5a5 Mon Sep 17 00:00:00 2001 From: flyskyko Date: Mon, 10 Sep 2012 10:18:36 +0000 Subject: [PATCH] issue 2351, fixed a bug that update core by easyinstall is failed. git-svn-id: http://xe-core.googlecode.com/svn/branches/1.5.3.2@11197 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- libs/tar.class.php | 90 ++++++++++++++++++++++++++++++---------------- 1 file changed, 59 insertions(+), 31 deletions(-) diff --git a/libs/tar.class.php b/libs/tar.class.php index 66294278d..d1fc9e428 100644 --- a/libs/tar.class.php +++ b/libs/tar.class.php @@ -109,6 +109,7 @@ class tar { // Read Files from archive $tar_length = strlen($this->tar_file); $main_offset = 0; + $flag_longlink = false; while($main_offset < $tar_length) { // If we read a block of 512 nulls, we are at the end of the archive if(substr($this->tar_file,$main_offset,512) == str_repeat(chr(0),512)) @@ -141,6 +142,8 @@ class tar { // Parse Group name $file_gname = $this->__parseNullPaddedString(substr($this->tar_file,$main_offset + 297,32)); + $file_type = substr($this->tar_file,$main_offset + 156,1); + // Make sure our file is valid if($this->__computeUnsignedChecksum(substr($this->tar_file,$main_offset,512)) != $file_chksum) return false; @@ -159,42 +162,67 @@ class tar { $activeFile["endheader"] = substr($this->tar_file,$main_offset + 500,12); */ - if($file_size > 0) { - // Increment number of files - $this->numFiles++; + elseif(strtolower($file_type) == 'l' || $file_name == '././@LongLink') + { + $flag_longlink = true; + $longlink_name = $file_contents; + } + elseif($file_type == '0') { + // Increment number of files + $this->numFiles++; - // Create us a new file in our array - $activeFile = &$this->files[]; + // Create us a new file in our array + $activeFile = &$this->files[]; - // Asign Values - $activeFile["name"] = $file_name; - $activeFile["mode"] = $file_mode; - $activeFile["size"] = $file_size; - $activeFile["time"] = $file_time; - $activeFile["user_id"] = $file_uid; - $activeFile["group_id"] = $file_gid; - $activeFile["user_name"] = $file_uname; - $activeFile["group_name"] = $file_gname; - $activeFile["checksum"] = $file_chksum; - $activeFile["file"] = $file_contents; + // Asign Values + if($flag_longlink) + { + $activeFile["name"] = $longlink_name; + } + else + { + $activeFile["name"] = $file_name; + } + $activeFile["type"] = $file_type; + $activeFile["mode"] = $file_mode; + $activeFile["size"] = $file_size; + $activeFile["time"] = $file_time; + $activeFile["user_id"] = $file_uid; + $activeFile["group_id"] = $file_gid; + $activeFile["user_name"] = $file_uname; + $activeFile["group_name"] = $file_gname; + $activeFile["checksum"] = $file_chksum; + $activeFile["file"] = $file_contents; - } else { - // Increment number of directories - $this->numDirectories++; + $flag_longlink = false; - // Create a new directory in our array - $activeDir = &$this->directories[]; + } elseif($file_type == '5') { + // Increment number of directories + $this->numDirectories++; - // Assign values - $activeDir["name"] = $file_name; - $activeDir["mode"] = $file_mode; - $activeDir["time"] = $file_time; - $activeDir["user_id"] = $file_uid; - $activeDir["group_id"] = $file_gid; - $activeDir["user_name"] = $file_uname; - $activeDir["group_name"] = $file_gname; - $activeDir["checksum"] = $file_chksum; - } + // Create a new directory in our array + $activeDir = &$this->directories[]; + + // Assign values + if($flag_longlink) + { + $activeDir["name"] = $longlink_name; + } + else + { + $activeDir["name"] = $file_name; + } + $activeDir["type"] = $file_type; + $activeDir["mode"] = $file_mode; + $activeDir["time"] = $file_time; + $activeDir["user_id"] = $file_uid; + $activeDir["group_id"] = $file_gid; + $activeDir["user_name"] = $file_uname; + $activeDir["group_name"] = $file_gname; + $activeDir["checksum"] = $file_chksum; + + $flag_longlink = false; + } // Move our offset the number of blocks we have processed $main_offset += 512 + (ceil($file_size / 512) * 512);