From f0ee49b5bcde39ac6c36d3837666aa9a36383066 Mon Sep 17 00:00:00 2001 From: Brad Fitzpatrick Date: Tue, 14 Jan 2020 18:15:25 +0000 Subject: [PATCH] mime: fix ExtensionsByType bug when there are duplicates Also, sort them so the results aren't random. Thanks to @junedev for the bug report & repro. Fixes #36524 Change-Id: Ic9197ebeceddfb3d0aee895d8fc12ce4d205b164 Reviewed-on: https://go-review.googlesource.com/c/go/+/214680 Reviewed-by: Ian Lance Taylor Run-TryBot: Ian Lance Taylor TryBot-Result: Gobot Gobot --- src/mime/type.go | 7 +++++-- src/mime/type_test.go | 27 +++++++++++++++++++++++++++ 2 files changed, 32 insertions(+), 2 deletions(-) diff --git a/src/mime/type.go b/src/mime/type.go index aa05077e22..260c535af0 100644 --- a/src/mime/type.go +++ b/src/mime/type.go @@ -7,6 +7,7 @@ package mime import ( "fmt" + "sort" "strings" "sync" ) @@ -49,7 +50,7 @@ func setMimeTypes(lowerExt, mixExt map[string]string) { panic(err) } var exts []string - if ei, ok := extensions.Load(k); ok { + if ei, ok := extensions.Load(justType); ok { exts = ei.([]string) } extensions.Store(justType, append(exts, k)) @@ -151,7 +152,9 @@ func ExtensionsByType(typ string) ([]string, error) { if !ok { return nil, nil } - return append([]string{}, s.([]string)...), nil + ret := append([]string(nil), s.([]string)...) + sort.Strings(ret) + return ret, nil } // AddExtensionType sets the MIME type associated with diff --git a/src/mime/type_test.go b/src/mime/type_test.go index e7aef9a196..f10e6343f9 100644 --- a/src/mime/type_test.go +++ b/src/mime/type_test.go @@ -188,3 +188,30 @@ func BenchmarkExtensionsByType(b *testing.B) { }) } } + +func TestExtensionsByType2(t *testing.T) { + cleanup := setMimeInit(func() { + clearMimeTypes() + // Initialize built-in types like in type.go before osInitMime. + setMimeTypes(builtinTypesLower, builtinTypesLower) + }) + defer cleanup() + + tests := []struct { + typ string + want []string + }{ + {typ: "image/jpeg", want: []string{".jpeg", ".jpg"}}, + } + + for _, tt := range tests { + got, err := ExtensionsByType(tt.typ) + if err != nil { + t.Errorf("ExtensionsByType(%q): %v", tt.typ, err) + continue + } + if !reflect.DeepEqual(got, tt.want) { + t.Errorf("ExtensionsByType(%q) = %q; want %q", tt.typ, got, tt.want) + } + } +} -- 2.50.0