fileserver: Fix handling of symlink sizes in directory listings (#4415)

This commit is contained in:
Jeremy Lin 2021-11-22 13:59:09 -08:00 committed by GitHub
parent eead337324
commit c8b5a81607
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
2 changed files with 13 additions and 13 deletions

View file

@ -141,12 +141,7 @@ func (fsrv *FileServer) loadDirectoryContents(dir *os.File, root, urlPath string
// user can presumably browse "up" to parent folder if path is longer than "/" // user can presumably browse "up" to parent folder if path is longer than "/"
canGoUp := len(urlPath) > 1 canGoUp := len(urlPath) > 1
l, err := fsrv.directoryListing(files, canGoUp, root, urlPath, repl) return fsrv.directoryListing(files, canGoUp, root, urlPath, repl), nil
if err != nil {
return browseTemplateContext{}, err
}
return l, nil
} }
// browseApplyQueryParams applies query parameters to the listing. // browseApplyQueryParams applies query parameters to the listing.

View file

@ -24,10 +24,11 @@ import (
"time" "time"
"github.com/caddyserver/caddy/v2" "github.com/caddyserver/caddy/v2"
"github.com/caddyserver/caddy/v2/modules/caddyhttp"
"github.com/dustin/go-humanize" "github.com/dustin/go-humanize"
) )
func (fsrv *FileServer) directoryListing(files []os.FileInfo, canGoUp bool, root, urlPath string, repl *caddy.Replacer) (browseTemplateContext, error) { func (fsrv *FileServer) directoryListing(files []os.FileInfo, canGoUp bool, root, urlPath string, repl *caddy.Replacer) browseTemplateContext {
filesToHide := fsrv.transformHidePaths(repl) filesToHide := fsrv.transformHidePaths(repl)
var dirCount, fileCount int var dirCount, fileCount int
@ -52,14 +53,18 @@ func (fsrv *FileServer) directoryListing(files []os.FileInfo, canGoUp bool, root
fileCount++ fileCount++
} }
fileIsSymlink := isSymlink(f)
size := f.Size() size := f.Size()
fileIsSymlink := isSymlink(f)
if fileIsSymlink { if fileIsSymlink {
info, err := os.Stat(name) path := caddyhttp.SanitizedPathJoin(root, path.Join(urlPath, f.Name()))
if err != nil { fileInfo, err := os.Stat(path)
return browseTemplateContext{}, err if err == nil {
size = fileInfo.Size()
} }
size = info.Size() // An error most likely means the symlink target doesn't exist,
// which isn't entirely unusual and shouldn't fail the listing.
// In this case, just use the size of the symlink itself, which
// was already set above.
} }
fileInfos = append(fileInfos, fileInfo{ fileInfos = append(fileInfos, fileInfo{
@ -80,7 +85,7 @@ func (fsrv *FileServer) directoryListing(files []os.FileInfo, canGoUp bool, root
Items: fileInfos, Items: fileInfos,
NumDirs: dirCount, NumDirs: dirCount,
NumFiles: fileCount, NumFiles: fileCount,
}, nil }
} }
// browseTemplateContext provides the template context for directory listings. // browseTemplateContext provides the template context for directory listings.