Skip to content

Commit

Permalink
#18 Fix decoding of DOS attributes in External Attributes field
Browse files Browse the repository at this point in the history
Fitst 16 bits of the decoded External Attributes in Central header should map to  DOS attributes.

Code for decoding this has a few wrong (Offline, Not tIndexed & Encrypted ) plus some were missing

Also, added the 7z/p7zip flag (for 0x8000) and the mysterious bit  ( 0x4000) bit set by Mac zip files.
  • Loading branch information
pmqs committed Apr 16, 2024
1 parent f4ac21d commit 19e1c38
Show file tree
Hide file tree
Showing 21 changed files with 42 additions and 44 deletions.
46 changes: 22 additions & 24 deletions bin/zipdetails
Original file line number Diff line number Diff line change
Expand Up @@ -2624,30 +2624,28 @@ sub CentralHeader
# See https://learn.microsoft.com/en-us/windows/win32/fileio/file-attribute-constants
# and https://learn.microsoft.com/en-us/openspecs/windows_protocols/ms-smb/65e0c225-5925-44b0-8104-6b91339c709f

out1 "[Bit 0]", "Read-Only"
if $dos_attrib & 0x0001 ;
out1 "[Bit 1]", "Hidden"
if $dos_attrib & 0x0002 ;
out1 "[Bit 2]", "System"
if $dos_attrib & 0x0004 ;
out1 "[Bit 3]", "Label"
if $dos_attrib & 0x0008 ;
out1 "[Bit 4]", "Directory"
if $dos_attrib & 0x0010 ;
out1 "[Bit 5]", "Archive"
if $dos_attrib & 0x0020 ;
out1 "[Bit 6]", "Device"
if $dos_attrib & 0x0040 ;
out1 "[Bit 7]", "Normal" # Exe?
if $dos_attrib & 0x0080 ;
out1 "[Bit 8]", "Offline"
if $dos_attrib & 0x0100 ;
out1 "[Bit 9]", "Not Indexed"
if $dos_attrib & 0x0200 ;
out1 "[Bit 10]", "Encrypted"
if $dos_attrib & 0x0400 ;
out1 "[Bits 11-15]", Value_v($dos_attrib & 0xf800) . " 'Unknown DOS attrib'"
if $dos_attrib & 0xf800 ;
out1 "[Bit 0]", "Read-Only" if $dos_attrib & 0x0001 ;
out1 "[Bit 1]", "Hidden" if $dos_attrib & 0x0002 ;
out1 "[Bit 2]", "System" if $dos_attrib & 0x0004 ;
out1 "[Bit 3]", "Label" if $dos_attrib & 0x0008 ;
out1 "[Bit 4]", "Directory" if $dos_attrib & 0x0010 ;
out1 "[Bit 5]", "Archive" if $dos_attrib & 0x0020 ;
out1 "[Bit 6]", "Device" if $dos_attrib & 0x0040 ;
out1 "[Bit 7]", "Normal" if $dos_attrib & 0x0080 ;
out1 "[Bit 8]", "Temporary" if $dos_attrib & 0x0100 ;
out1 "[Bit 9]", "Sparse" if $dos_attrib & 0x0200 ;
out1 "[Bit 10]", "Reparse Point" if $dos_attrib & 0x0400 ;
out1 "[Bit 11]", "Compressed" if $dos_attrib & 0x0800 ;

out1 "[Bit 12]", "Offline" if $dos_attrib & 0x1000 ;
out1 "[Bit 13]", "Not Indexed" if $dos_attrib & 0x2000 ;

# Zip files created on Mac seem to set this bit. Not clear why.
out1 "[Bit 14]", "Possible Mac Flag" if $dos_attrib & 0x4000 ;

# p7Zip & 7z set this bit to flag that the high 16-bits are Unix attributes
out1 "[Bit 15]", "Possible p7zip/7z Unix Flag" if $dos_attrib & 0x8000 ;

}

my $native_attrib = ($ext_file_attrib >> 16 ) & 0xFFFF;
Expand Down
2 changes: 1 addition & 1 deletion t/files/0002-7z/linux/7z-linux-aes128/stdout
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,7 @@
[Bit 0] 0 'Binary Data'
0176 Ext File Attributes 81ED8020 (2179825696)
[Bit 5] Archive
[Bits 11-15] 8000 (32768) 'Unknown DOS attrib'
[Bit 15] Possible p7zip/7z Unix Flag
[Bits 16-24] 01ED (493) 'Unix attrib: rwxr-xr-x'
[Bits 28-31] 08 (8) 'Regular File'
017A Local Header Offset 00000000 (0)
Expand Down
2 changes: 1 addition & 1 deletion t/files/0002-7z/linux/7z-linux-aes128/stdout-v
Original file line number Diff line number Diff line change
Expand Up @@ -48,7 +48,7 @@
[Bit 0] 0 'Binary Data'
0176 0179 0004 20 80 ED 81 Ext File Attributes 81ED8020 (2179825696)
[Bit 5] Archive
[Bits 11-15] 8000 (32768) 'Unknown DOS attrib'
[Bit 15] Possible p7zip/7z Unix Flag
[Bits 16-24] 01ED (493) 'Unix attrib: rwxr-xr-x'
[Bits 28-31] 08 (8) 'Regular File'
017A 017D 0004 00 00 00 00 Local Header Offset 00000000 (0)
Expand Down
2 changes: 1 addition & 1 deletion t/files/0002-7z/linux/7z-linux-aes192/stdout
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,7 @@
[Bit 0] 0 'Binary Data'
017A Ext File Attributes 81ED8020 (2179825696)
[Bit 5] Archive
[Bits 11-15] 8000 (32768) 'Unknown DOS attrib'
[Bit 15] Possible p7zip/7z Unix Flag
[Bits 16-24] 01ED (493) 'Unix attrib: rwxr-xr-x'
[Bits 28-31] 08 (8) 'Regular File'
017E Local Header Offset 00000000 (0)
Expand Down
2 changes: 1 addition & 1 deletion t/files/0002-7z/linux/7z-linux-aes192/stdout-v
Original file line number Diff line number Diff line change
Expand Up @@ -49,7 +49,7 @@
[Bit 0] 0 'Binary Data'
017A 017D 0004 20 80 ED 81 Ext File Attributes 81ED8020 (2179825696)
[Bit 5] Archive
[Bits 11-15] 8000 (32768) 'Unknown DOS attrib'
[Bit 15] Possible p7zip/7z Unix Flag
[Bits 16-24] 01ED (493) 'Unix attrib: rwxr-xr-x'
[Bits 28-31] 08 (8) 'Regular File'
017E 0181 0004 00 00 00 00 Local Header Offset 00000000 (0)
Expand Down
2 changes: 1 addition & 1 deletion t/files/0002-7z/linux/7z-linux-aes256/stdout
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,7 @@
[Bit 0] 0 'Binary Data'
017E Ext File Attributes 81ED8020 (2179825696)
[Bit 5] Archive
[Bits 11-15] 8000 (32768) 'Unknown DOS attrib'
[Bit 15] Possible p7zip/7z Unix Flag
[Bits 16-24] 01ED (493) 'Unix attrib: rwxr-xr-x'
[Bits 28-31] 08 (8) 'Regular File'
0182 Local Header Offset 00000000 (0)
Expand Down
2 changes: 1 addition & 1 deletion t/files/0002-7z/linux/7z-linux-aes256/stdout-v
Original file line number Diff line number Diff line change
Expand Up @@ -50,7 +50,7 @@
[Bit 0] 0 'Binary Data'
017E 0181 0004 20 80 ED 81 Ext File Attributes 81ED8020 (2179825696)
[Bit 5] Archive
[Bits 11-15] 8000 (32768) 'Unknown DOS attrib'
[Bit 15] Possible p7zip/7z Unix Flag
[Bits 16-24] 01ED (493) 'Unix attrib: rwxr-xr-x'
[Bits 28-31] 08 (8) 'Regular File'
0182 0185 0004 00 00 00 00 Local Header Offset 00000000 (0)
Expand Down
2 changes: 1 addition & 1 deletion t/files/0002-7z/linux/7z-linux-bzip2/stdout
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,7 @@
[Bit 0] 0 'Binary Data'
0181 Ext File Attributes 81ED8020 (2179825696)
[Bit 5] Archive
[Bits 11-15] 8000 (32768) 'Unknown DOS attrib'
[Bit 15] Possible p7zip/7z Unix Flag
[Bits 16-24] 01ED (493) 'Unix attrib: rwxr-xr-x'
[Bits 28-31] 08 (8) 'Regular File'
0185 Local Header Offset 00000000 (0)
Expand Down
2 changes: 1 addition & 1 deletion t/files/0002-7z/linux/7z-linux-bzip2/stdout-v
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,7 @@
[Bit 0] 0 'Binary Data'
0181 0184 0004 20 80 ED 81 Ext File Attributes 81ED8020 (2179825696)
[Bit 5] Archive
[Bits 11-15] 8000 (32768) 'Unknown DOS attrib'
[Bit 15] Possible p7zip/7z Unix Flag
[Bits 16-24] 01ED (493) 'Unix attrib: rwxr-xr-x'
[Bits 28-31] 08 (8) 'Regular File'
0185 0188 0004 00 00 00 00 Local Header Offset 00000000 (0)
Expand Down
2 changes: 1 addition & 1 deletion t/files/0002-7z/linux/7z-linux-copy/stdout
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,7 @@
[Bit 0] 0 'Binary Data'
020B Ext File Attributes 81ED8020 (2179825696)
[Bit 5] Archive
[Bits 11-15] 8000 (32768) 'Unknown DOS attrib'
[Bit 15] Possible p7zip/7z Unix Flag
[Bits 16-24] 01ED (493) 'Unix attrib: rwxr-xr-x'
[Bits 28-31] 08 (8) 'Regular File'
020F Local Header Offset 00000000 (0)
Expand Down
2 changes: 1 addition & 1 deletion t/files/0002-7z/linux/7z-linux-copy/stdout-v
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,7 @@
[Bit 0] 0 'Binary Data'
020B 020E 0004 20 80 ED 81 Ext File Attributes 81ED8020 (2179825696)
[Bit 5] Archive
[Bits 11-15] 8000 (32768) 'Unknown DOS attrib'
[Bit 15] Possible p7zip/7z Unix Flag
[Bits 16-24] 01ED (493) 'Unix attrib: rwxr-xr-x'
[Bits 28-31] 08 (8) 'Regular File'
020F 0212 0004 00 00 00 00 Local Header Offset 00000000 (0)
Expand Down
2 changes: 1 addition & 1 deletion t/files/0002-7z/linux/7z-linux-deflate64/stdout
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,7 @@
[Bit 0] 0 'Binary Data'
0157 Ext File Attributes 81ED8020 (2179825696)
[Bit 5] Archive
[Bits 11-15] 8000 (32768) 'Unknown DOS attrib'
[Bit 15] Possible p7zip/7z Unix Flag
[Bits 16-24] 01ED (493) 'Unix attrib: rwxr-xr-x'
[Bits 28-31] 08 (8) 'Regular File'
015B Local Header Offset 00000000 (0)
Expand Down
2 changes: 1 addition & 1 deletion t/files/0002-7z/linux/7z-linux-deflate64/stdout-v
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,7 @@
[Bit 0] 0 'Binary Data'
0157 015A 0004 20 80 ED 81 Ext File Attributes 81ED8020 (2179825696)
[Bit 5] Archive
[Bits 11-15] 8000 (32768) 'Unknown DOS attrib'
[Bit 15] Possible p7zip/7z Unix Flag
[Bits 16-24] 01ED (493) 'Unix attrib: rwxr-xr-x'
[Bits 28-31] 08 (8) 'Regular File'
015B 015E 0004 00 00 00 00 Local Header Offset 00000000 (0)
Expand Down
2 changes: 1 addition & 1 deletion t/files/0002-7z/linux/7z-linux-directory/stdout
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,7 @@
[Bit 0] 0 'Binary Data'
004C Ext File Attributes 41FD8010 (1107132432)
[Bit 4] Directory
[Bits 11-15] 8000 (32768) 'Unknown DOS attrib'
[Bit 15] Possible p7zip/7z Unix Flag
[Bits 16-24] 01FD (509) 'Unix attrib: rwxrwxr-x'
[Bits 28-31] 04 (4) 'Directory'
0050 Local Header Offset 00000000 (0)
Expand Down
2 changes: 1 addition & 1 deletion t/files/0002-7z/linux/7z-linux-directory/stdout-v
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,7 @@
[Bit 0] 0 'Binary Data'
004C 004F 0004 10 80 FD 41 Ext File Attributes 41FD8010 (1107132432)
[Bit 4] Directory
[Bits 11-15] 8000 (32768) 'Unknown DOS attrib'
[Bit 15] Possible p7zip/7z Unix Flag
[Bits 16-24] 01FD (509) 'Unix attrib: rwxrwxr-x'
[Bits 28-31] 04 (4) 'Directory'
0050 0053 0004 00 00 00 00 Local Header Offset 00000000 (0)
Expand Down
2 changes: 1 addition & 1 deletion t/files/0002-7z/linux/7z-linux-lzma/stdout
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,7 @@
[Bit 0] 0 'Binary Data'
019C Ext File Attributes 81ED8020 (2179825696)
[Bit 5] Archive
[Bits 11-15] 8000 (32768) 'Unknown DOS attrib'
[Bit 15] Possible p7zip/7z Unix Flag
[Bits 16-24] 01ED (493) 'Unix attrib: rwxr-xr-x'
[Bits 28-31] 08 (8) 'Regular File'
01A0 Local Header Offset 00000000 (0)
Expand Down
2 changes: 1 addition & 1 deletion t/files/0002-7z/linux/7z-linux-lzma/stdout-v
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,7 @@
[Bit 0] 0 'Binary Data'
019C 019F 0004 20 80 ED 81 Ext File Attributes 81ED8020 (2179825696)
[Bit 5] Archive
[Bits 11-15] 8000 (32768) 'Unknown DOS attrib'
[Bit 15] Possible p7zip/7z Unix Flag
[Bits 16-24] 01ED (493) 'Unix attrib: rwxr-xr-x'
[Bits 28-31] 08 (8) 'Regular File'
01A0 01A3 0004 00 00 00 00 Local Header Offset 00000000 (0)
Expand Down
2 changes: 1 addition & 1 deletion t/files/0002-7z/linux/7z-linux-ppmd/stdout
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,7 @@
[Bit 0] 0 'Binary Data'
0153 Ext File Attributes 81ED8020 (2179825696)
[Bit 5] Archive
[Bits 11-15] 8000 (32768) 'Unknown DOS attrib'
[Bit 15] Possible p7zip/7z Unix Flag
[Bits 16-24] 01ED (493) 'Unix attrib: rwxr-xr-x'
[Bits 28-31] 08 (8) 'Regular File'
0157 Local Header Offset 00000000 (0)
Expand Down
2 changes: 1 addition & 1 deletion t/files/0002-7z/linux/7z-linux-ppmd/stdout-v
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,7 @@
[Bit 0] 0 'Binary Data'
0153 0156 0004 20 80 ED 81 Ext File Attributes 81ED8020 (2179825696)
[Bit 5] Archive
[Bits 11-15] 8000 (32768) 'Unknown DOS attrib'
[Bit 15] Possible p7zip/7z Unix Flag
[Bits 16-24] 01ED (493) 'Unix attrib: rwxr-xr-x'
[Bits 28-31] 08 (8) 'Regular File'
0157 015A 0004 00 00 00 00 Local Header Offset 00000000 (0)
Expand Down
2 changes: 1 addition & 1 deletion t/files/0002-7z/linux/7z-linux-zipcrypto/stdout
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,7 @@
[Bit 0] 0 'Binary Data'
0163 Ext File Attributes 81ED8020 (2179825696)
[Bit 5] Archive
[Bits 11-15] 8000 (32768) 'Unknown DOS attrib'
[Bit 15] Possible p7zip/7z Unix Flag
[Bits 16-24] 01ED (493) 'Unix attrib: rwxr-xr-x'
[Bits 28-31] 08 (8) 'Regular File'
0167 Local Header Offset 00000000 (0)
Expand Down
2 changes: 1 addition & 1 deletion t/files/0002-7z/linux/7z-linux-zipcrypto/stdout-v
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,7 @@
[Bit 0] 0 'Binary Data'
0163 0166 0004 20 80 ED 81 Ext File Attributes 81ED8020 (2179825696)
[Bit 5] Archive
[Bits 11-15] 8000 (32768) 'Unknown DOS attrib'
[Bit 15] Possible p7zip/7z Unix Flag
[Bits 16-24] 01ED (493) 'Unix attrib: rwxr-xr-x'
[Bits 28-31] 08 (8) 'Regular File'
0167 016A 0004 00 00 00 00 Local Header Offset 00000000 (0)
Expand Down

0 comments on commit 19e1c38

Please sign in to comment.