]> Cypherpunks repositories - gostls13.git/commitdiff
net/http: fix wrong mime rar signature
authorLE Manh Cuong <cuong.manhle.vn@gmail.com>
Tue, 19 Mar 2019 09:16:50 +0000 (16:16 +0700)
committerEmmanuel Odeke <emm.odeke@gmail.com>
Tue, 19 Mar 2019 15:54:05 +0000 (15:54 +0000)
MIME sniffing standard defines the RAR signature as 52 61 72 20 1A 07 00.

But this signature is wrong, the RARlab spec defines the 4th byte must
be 0x21 or "!", not 0x20 or " ". Checking a rar file also indicates that:

$ file abc.rar
abc.rar: RAR archive data, v1d, os: Win32
$ head -c 7 abc.rar | od -v -t x1
0000000 52 61 72 21 1a 07 00
0000007

There is also an issue to fix this problem in MIME standard.

See:
 - https://www.rarlab.com/technote.htm#rarsign
 - https://github.com/whatwg/mimesniff/issues/63

Fixes #30926

Change-Id: Id2e2de7ecbf7f44d37ebaf280efd05e4972c5078
Reviewed-on: https://go-review.googlesource.com/c/go/+/167781
Reviewed-by: Brad Fitzpatrick <bradfitz@golang.org>
Reviewed-by: Emmanuel Odeke <emm.odeke@gmail.com>
Run-TryBot: Brad Fitzpatrick <bradfitz@golang.org>
TryBot-Result: Gobot Gobot <gobot@golang.org>

src/net/http/sniff.go
src/net/http/sniff_test.go

index 114a88ccba2c2d6b3c1234d8903694d1d932c3f8..67a7151b0cc1fb615fa8ce30fe529e1b6e0ee42f 100644 (file)
@@ -185,8 +185,14 @@ var sniffSignatures = []sniffSig{
        // Archive types
        &exactSig{[]byte("\x1F\x8B\x08"), "application/x-gzip"},
        &exactSig{[]byte("PK\x03\x04"), "application/zip"},
-       &exactSig{[]byte("Rar \x1A\x07\x00"), "application/x-rar-compressed"},     // RAR v1.5-v4.0
-       &exactSig{[]byte("Rar \x1A\x07\x01\x00"), "application/x-rar-compressed"}, // RAR v5+
+       // RAR's signatures are incorrectly defined by the MIME spec as per
+       //    https://github.com/whatwg/mimesniff/issues/63
+       // However, RAR Labs correctly defines it at:
+       //    https://www.rarlab.com/technote.htm#rarsign
+       // so we use the definition from RAR Labs.
+       // TODO: do whatever the spec ends up doing.
+       &exactSig{[]byte("Rar!\x1A\x07\x00"), "application/x-rar-compressed"},     // RAR v1.5-v4.0
+       &exactSig{[]byte("Rar!\x1A\x07\x01\x00"), "application/x-rar-compressed"}, // RAR v5+
 
        &exactSig{[]byte("\x00\x61\x73\x6D"), "application/wasm"},
 
index 08ae79c28501396129022c458a0bec5831411713..a1157a0823e5e658068eab93284c6fa068ce944f 100644 (file)
@@ -74,8 +74,10 @@ var sniffTests = []struct {
        {"wasm sample", []byte("\x00\x61\x73\x6d\x01\x00"), "application/wasm"},
 
        // Archive types
-       {"RAR v1.5-v4.0", []byte("Rar \x1A\x07\x00"), "application/x-rar-compressed"},
-       {"RAR v5+", []byte("Rar \x1A\x07\x01\x00"), "application/x-rar-compressed"},
+       {"RAR v1.5-v4.0", []byte("Rar!\x1A\x07\x00"), "application/x-rar-compressed"},
+       {"RAR v5+", []byte("Rar!\x1A\x07\x01\x00"), "application/x-rar-compressed"},
+       {"Incorrect RAR v1.5-v4.0", []byte("Rar \x1A\x07\x00"), "application/octet-stream"},
+       {"Incorrect RAR v5+", []byte("Rar \x1A\x07\x01\x00"), "application/octet-stream"},
 }
 
 func TestDetectContentType(t *testing.T) {