]> Cypherpunks.ru repositories - gostls13.git/commitdiff
archive/zip: fix character device handling in fileModeToUnixMode
authorTom Thorogood <me+google@tomthorogood.co.uk>
Fri, 12 Mar 2021 13:57:30 +0000 (00:27 +1030)
committerEmmanuel Odeke <emmanuel@orijtech.com>
Sat, 3 Apr 2021 20:16:00 +0000 (20:16 +0000)
The switch case for fs.ModeDevice can only be reached for block devices
while character devices match fs.ModeDevice | fs.ModeCharDevice. This
would cause character devices to wrongly be reported as regular files.

This bug has existed since the switch was first introduced in CL 5624048.

Change-Id: Icdbedb015e5376b385b3115d2e4574daa052f796
Reviewed-on: https://go-review.googlesource.com/c/go/+/300891
Run-TryBot: Ian Lance Taylor <iant@golang.org>
TryBot-Result: Go Bot <gobot@golang.org>
Reviewed-by: Ian Lance Taylor <iant@golang.org>
Trust: Emmanuel Odeke <emmanuel@orijtech.com>

src/archive/zip/struct.go
src/archive/zip/writer_test.go

index 4dd29f35fa63f6e8d898ab2b55faa46b3611d918..3dc0c50122a83426cf23d39829b283b486365c02 100644 (file)
@@ -341,11 +341,9 @@ func fileModeToUnixMode(mode fs.FileMode) uint32 {
        case fs.ModeSocket:
                m = s_IFSOCK
        case fs.ModeDevice:
-               if mode&fs.ModeCharDevice != 0 {
-                       m = s_IFCHR
-               } else {
-                       m = s_IFBLK
-               }
+               m = s_IFBLK
+       case fs.ModeDevice | fs.ModeCharDevice:
+               m = s_IFCHR
        }
        if mode&fs.ModeSetuid != 0 {
                m |= s_ISUID
index 5985144e5c2d25fb3df2fe37682fa0fd4c1b3d8a..3fa8bef0553c4de1a3135ec335c90668042aa820 100644 (file)
@@ -57,6 +57,18 @@ var writeTests = []WriteTest{
                Method: Deflate,
                Mode:   0755 | fs.ModeSymlink,
        },
+       {
+               Name:   "device",
+               Data:   []byte("device file"),
+               Method: Deflate,
+               Mode:   0755 | fs.ModeDevice,
+       },
+       {
+               Name:   "chardevice",
+               Data:   []byte("char device file"),
+               Method: Deflate,
+               Mode:   0755 | fs.ModeDevice | fs.ModeCharDevice,
+       },
 }
 
 func TestWriter(t *testing.T) {