2013-02-05 Wojciech Kocjan <zoro2@users.sourceforge.net>
authorWojciech Kocjan <zoro2@users.sourceforge.net>
Tue, 5 Feb 2013 13:18:48 +0000 (13:18 +0000)
committerWojciech Kocjan <zoro2@users.sourceforge.net>
Tue, 5 Feb 2013 13:18:48 +0000 (13:18 +0000)
* library/zipvfs.tcl: vfs::zip unable to read zip archives with wrong modes, bug 3603414

library/zipvfs.tcl

index 7abc5a74d0c848ec718510e54dddbe4e57f6f457..3d4b4efd8873d790d1a98029a4296b918056e596 100644 (file)
@@ -73,10 +73,22 @@ proc vfs::zip::stat {zipfd name} {
     #::vfs::log "stat $name"
     ::zip::stat $zipfd $name sb
     #::vfs::log [array get sb]
-    # remove socket mode bit (0xc000) to prevent Tcl from reporting Fossil archives as socket types
-    if {($sb(mode) & 0xc000) == 0xc000} {
+    # remove socket mode file type (0xc000) to prevent Tcl from reporting Fossil archives as socket types
+    if {($sb(mode) & 0xf000) == 0xc000} {
         set sb(mode) [expr {$sb(mode) ^ 0xc000}]
     }
+    # remove block device bit file type (0x6000)
+    if {($sb(mode) & 0xf000) == 0x6000} {
+        set sb(mode) [expr {$sb(mode) ^ 0x6000}]
+    }
+    # remove FIFO mode file type (0x1000)
+    if {($sb(mode) & 0xf000) == 0x1000} {
+        set sb(mode) [expr {$sb(mode) ^ 0x1000}]
+    }
+    # remove character device mode file type (0x2000)
+    if {($sb(mode) & 0xf000) == 0x2000} {
+        set sb(mode) [expr {$sb(mode) ^ 0x2000}]
+    }
     array get sb
 }