Index: kitsh/buildsrc/kitsh-0.0/zipvfs.tcl ================================================================== --- kitsh/buildsrc/kitsh-0.0/zipvfs.tcl +++ kitsh/buildsrc/kitsh-0.0/zipvfs.tcl @@ -351,11 +351,16 @@ break } } set hdr [string range $hdr [expr $pos + 4] [expr $pos + 21]] - set pos [expr [tell $fd] + $pos - 512] + + set seekstart [expr {[tell $fd] - 512}] + if {$seekstart < 0} { + set seekstart 0 + } + set pos [expr {$seekstart + $pos}] binary scan $hdr ssssiis \ cb(ndisk) cb(cdisk) \ cb(nitems) cb(ntotal) \ cb(csize) cb(coff) \ @@ -366,11 +371,15 @@ set cb(ntotal) [u_short $cb(ntotal)] set cb(comment) [u_short $cb(comment)] # Compute base for situations where ZIP file # has been appended to another media (e.g. EXE) - set cb(base) [expr { $pos - $cb(csize) - $cb(coff) }] + set base [expr { $pos - $cb(csize) - $cb(coff) }] + if {$base < 0} { + set base 0 + } + set cb(base) $base } proc zip::TOC {fd arr} { upvar #0 zip::$fd cb upvar 1 $arr sb Index: tclvfs/patches/all/tclvfs-20080503-zipvfs.diff ================================================================== --- tclvfs/patches/all/tclvfs-20080503-zipvfs.diff +++ tclvfs/patches/all/tclvfs-20080503-zipvfs.diff @@ -1,8 +1,8 @@ -diff -uNr tclvfs-20080503.orig/library/zipvfs.tcl tclvfs-20080503-3rsk/library/zipvfs.tcl +diff -uNr tclvfs-20080503.orig/library/zipvfs.tcl tclvfs-20080503-1rsk/library/zipvfs.tcl --- tclvfs-20080503.orig/library/zipvfs.tcl 2008-04-15 16:11:53.000000000 -0500 -+++ tclvfs-20080503-3rsk/library/zipvfs.tcl 2010-09-19 03:37:33.000000000 -0500 ++++ tclvfs-20080503-1rsk/library/zipvfs.tcl 2010-09-28 16:43:12.000000000 -0500 @@ -107,6 +107,10 @@ ::zip::stat $zipfd $name sb + if {$sb(ino) == -1} { @@ -42,31 +42,54 @@ } + return $res } -@@ -400,6 +404,7 @@ +@@ -381,7 +385,12 @@ + } + + set hdr [string range $hdr [expr $pos + 4] [expr $pos + 21]] +- set pos [expr [tell $fd] + $pos - 512] ++ ++ set seekstart [expr {[tell $fd] - 512}] ++ if {$seekstart < 0} { ++ set seekstart 0 ++ } ++ set pos [expr {$seekstart + $pos}] + + binary scan $hdr ssssiis \ + cb(ndisk) cb(cdisk) \ +@@ -396,10 +405,15 @@ + + # Compute base for situations where ZIP file + # has been appended to another media (e.g. EXE) +- set cb(base) [expr { $pos - $cb(csize) - $cb(coff) }] ++ set base [expr { $pos - $cb(csize) - $cb(coff) }] ++ if {$base < 0} { ++ set base 0 ++ } ++ set cb(base) $base } proc zip::TOC {fd arr} { + upvar #0 zip::$fd cb upvar 1 $arr sb set buf [read $fd 46] -@@ -410,6 +415,8 @@ +@@ -410,6 +424,8 @@ flen elen clen sb(disk) sb(attr) \ sb(atx) sb(ino) + set sb(ino) [expr {$cb(base) + $sb(ino)}] + if { ![string equal "PK\01\02" $hdr] } { binary scan $hdr H* x error "bad central header: $x" -@@ -442,7 +449,7 @@ +@@ -442,7 +458,7 @@ zip::EndOfArchive $fd cb - seek $fd $cb(coff) start + seek $fd [expr {$cb(base) + $cb(coff)}] start set toc(_) 0; unset toc(_); #MakeArray