fix to zipvfs
authorVince Darley <vincentdarley@sourceforge.net>
Tue, 29 Jun 2004 12:47:00 +0000 (12:47 +0000)
committerVince Darley <vincentdarley@sourceforge.net>
Tue, 29 Jun 2004 12:47:00 +0000 (12:47 +0000)
ChangeLog
library/zipvfs.tcl

index e3e31aa05a2b9a8eb9688b629184e630c4f19688..caa981e399f47e9ab5c568052f796435729c527c 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,8 @@
+2004-06-29  Vince Darley <vincentdarley@sourceforge.net>
+
+       * library/zipvfs.tcl: fix to bug finding zip header (reported on
+       Tcl'ers wiki).
+
 2004-06-09  Jeff Hobbs  <jeffh@ActiveState.com>
 
        * Makefile.in: corrected targets that use 'for' over what may be
index 253c442b3f03e044036c7600ac1c37bc4f88e6b8..13a98d30e4d0893dd61f8e051c198709989382bd 100644 (file)
@@ -328,19 +328,20 @@ proc zip::Data {fd arr {varPtr ""} {verify 0}} {
 proc zip::EndOfArchive {fd arr} {
     upvar 1 $arr cb
 
-    seek $fd -22 end
-    set pos [tell $fd]
-    set hdr [read $fd 22]
+    seek $fd -512 end
+    set hdr [read $fd 512]
+    set pos [string first "PK\05\06" $hdr]
+    if {$pos == -1} {
+       error "no header found"
+    }
+    set hdr [string range $hdr [expr $pos + 4] [expr $pos + 21]]
+    set pos [expr [tell $fd] + $pos - 512]
 
-    binary scan $hdr A4ssssiis xhdr \
+    binary scan $hdr ssssiis \
        cb(ndisk) cb(cdisk) \
        cb(nitems) cb(ntotal) \
        cb(csize) cb(coff) \
-       cb(comment) 
-
-    if { ![string equal "PK\05\06" $xhdr]} {
-       error "bad header"
-    }
+       cb(comment)
 
     set cb(ndisk)      [u_short $cb(ndisk)]
     set cb(nitems)     [u_short $cb(nitems)]