1
2
3
4
5
6
7
8
9
10
|
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-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} {
+ vfs::filesystem posixerror $::vfs::posix(EISDIR)
+ }
|
|
|
1
2
3
4
5
6
7
8
9
10
|
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-1rsk/library/zipvfs.tcl 2010-10-01 21:48:38.000000000 -0500
@@ -107,6 +107,10 @@
::zip::stat $zipfd $name sb
+ if {$sb(ino) == -1} {
+ vfs::filesystem posixerror $::vfs::posix(EISDIR)
+ }
|
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
|
- # Only mday can be wrong, at end of month
- incr mday -1
}
+
return $res
}
@@ -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 +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 +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
|
>
>
>
>
>
>
>
>
>
>
>
>
|
|
|
|
|
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
|
- # Only mday can be wrong, at end of month
- incr mday -1
}
+
return $res
}
@@ -360,6 +364,11 @@
# after the whole file has been searched.
set sz [tell $fd]
+ if {[info exists ::zip::max_header_seek]} {
+ if {$::zip::max_header_seek < $sz} {
+ set sz $::zip::max_header_seek
+ }
+ }
set len 512
set at 512
while {1} {
@@ -381,7 +390,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 +410,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 +429,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 +463,7 @@
zip::EndOfArchive $fd cb
- seek $fd $cb(coff) start
+ seek $fd [expr {$cb(base) + $cb(coff)}] start
set toc(_) 0; unset toc(_); #MakeArray
|