in internal/vfs/zip/archive.go [252:295]
func (a *zipArchive) Readlink(ctx context.Context, name string) (string, error) {
file := a.findFile(name)
if file == nil {
if a.findDirectory(name) != nil {
return "", errNotSymlink
}
return "", os.ErrNotExist
}
if file.FileInfo().Mode()&os.ModeSymlink != os.ModeSymlink {
return "", errNotSymlink
}
symlinkValue, err := a.fs.readlinkCache.FindOrFetch(a.cacheNamespace, name, func() (interface{}, error) {
rc, err := file.Open()
if err != nil {
return nil, err
}
defer rc.Close()
var link [maxSymlinkSize + 1]byte
// read up to len(symlink) bytes from the link file
n, err := io.ReadFull(rc, link[:])
if err != nil && !errors.Is(err, io.ErrUnexpectedEOF) {
// if err == io.ErrUnexpectedEOF the link is smaller than len(symlink) so it's OK to not return it
return nil, err
}
return string(link[:n]), nil
})
if err != nil {
return "", err
}
symlink := symlinkValue.(string)
// return errSymlinkSize if the number of bytes read from the link is too big
if len(symlink) > maxSymlinkSize {
return "", errSymlinkSize
}
return symlink, nil
}