Commit 9007322
Eric Bower
·
2026-10-12 13:24:52 -0400 EDT
parent 2e0e17e
fix(pgs): reject directories during GetObject calls We were previously relying on the etag computation via io.Copy to implicitly reject directories.
3 files changed,
+11,
-1
+6,
-0
| ... | ... | @@ -106,6 +106,12 @@ func TestStorageConformance(t *testing.T) { | |
| 106 | 106 | if _, _, err := st.GetObject(b, "/proj/missing.txt"); err == nil { | |
| 107 | 107 | t.Fatal("missing object returned no error") | |
| 108 | 108 | } | |
| 109 | + | ||
| 110 | + | for _, dir := range []string{"/proj/css", "/proj/css/"} { | |
| 111 | + | if _, _, err := st.GetObject(b, dir); !errors.Is(err, fs.ErrNotExist) { | |
| 112 | + | t.Errorf("GetObject(%q) returned %v, want fs.ErrNotExist", dir, err) | |
| 113 | + | } | |
| 114 | + | } | |
| 109 | 115 | }) | |
| 110 | 116 | ||
| 111 | 117 | t.Run("stat", func(t *testing.T) { |
+4,
-0
| ... | ... | @@ -122,6 +122,10 @@ func (s *StorageFS) GetObject(bucket Bucket, fpath string) (utils.ReadAndReaderA | |
| 122 | 122 | _ = dat.Close() | |
| 123 | 123 | return nil, objInfo, err | |
| 124 | 124 | } | |
| 125 | + | if info.IsDir() { | |
| 126 | + | _ = dat.Close() | |
| 127 | + | return nil, objInfo, fmt.Errorf("%s is a directory: %w", fpath, fs.ErrNotExist) | |
| 128 | + | } | |
| 125 | 129 | fillObjectInfo(objInfo, info) | |
| 126 | 130 | return dat, objInfo, nil | |
| 127 | 131 | } |
+1,
-1
| ... | ... | @@ -129,7 +129,7 @@ func (s *StorageMemory) GetObject(bucket Bucket, fpath string) (utils.ReadAndRea | |
| 129 | 129 | ||
| 130 | 130 | dat, ok := s.storage[bucket.Path][fpath] | |
| 131 | 131 | if !ok || strings.HasSuffix(fpath, "/") { | |
| 132 | - | return nil, objInfo, fmt.Errorf("object does not exist: %s", fpath) | |
| 132 | + | return nil, objInfo, fmt.Errorf("object does not exist: %s: %w", fpath, fs.ErrNotExist) | |
| 133 | 133 | } | |
| 134 | 134 | ||
| 135 | 135 | objInfo.Size = int64(len([]byte(dat))) |