]> Cypherpunks repositories - gostls13.git/commitdiff
embed: treat uninitialized FS as empty
authorJay Conrod <jayconrod@google.com>
Thu, 14 Jan 2021 18:04:17 +0000 (13:04 -0500)
committerJay Conrod <jayconrod@google.com>
Tue, 19 Jan 2021 16:31:09 +0000 (16:31 +0000)
As described in the FS documentation.

This prevents http.FS and other clients from panicking when the
go:embed directive is missing.

For #43682
Related #43698

Change-Id: Iecf26d229a099e55d24670c3119cd6c6d17ecc6e
Reviewed-on: https://go-review.googlesource.com/c/go/+/283852
Run-TryBot: Jay Conrod <jayconrod@google.com>
TryBot-Result: Go Bot <gobot@golang.org>
Trust: Jay Conrod <jayconrod@google.com>
Reviewed-by: Bryan C. Mills <bcmills@google.com>
src/embed/embed.go
src/embed/internal/embedtest/embed_test.go

index 29e0adf1a63d1ddf6fbe165f98b3aa059346125d..cc6855e6a5b0cc740a5893d12d045a761a061756 100644 (file)
@@ -244,6 +244,9 @@ func (f FS) lookup(name string) *file {
        if name == "." {
                return dotFile
        }
+       if f.files == nil {
+               return nil
+       }
 
        // Binary search to find where name would be in the list,
        // and then check if name is at that position.
@@ -261,6 +264,9 @@ func (f FS) lookup(name string) *file {
 
 // readDir returns the list of files corresponding to the directory dir.
 func (f FS) readDir(dir string) []file {
+       if f.files == nil {
+               return nil
+       }
        // Binary search to find where dir starts and ends in the list
        // and then return that slice of the list.
        files := *f.files
index 40f65ffc3ff42444a1529f85defa3ce668ce8250..43ae5c7e0569c87e3f9b08db68e24501a2c72ca1 100644 (file)
@@ -112,3 +112,20 @@ func TestHidden(t *testing.T) {
        testDir(t, star, "testdata/.hidden",
                "fortune.txt", "more/") // but not .more or _more
 }
+
+func TestUninitialized(t *testing.T) {
+       var uninitialized embed.FS
+       testDir(t, uninitialized, ".")
+       f, err := uninitialized.Open(".")
+       if err != nil {
+               t.Fatal(err)
+       }
+       defer f.Close()
+       fi, err := f.Stat()
+       if err != nil {
+               t.Fatal(err)
+       }
+       if !fi.IsDir() {
+               t.Errorf("in uninitialized embed.FS, . is not a directory")
+       }
+}