mirror of
https://github.com/minio/minio.git
synced 2025-02-04 10:26:01 -05:00
Preallocate (safe) slices when we know the size (#10459)
This commit is contained in:
parent
b1c99e88ac
commit
34859c6d4b
@ -408,7 +408,7 @@ func getObjectLocation(r *http.Request, domains []string, bucket, object string)
|
|||||||
// generates ListBucketsResponse from array of BucketInfo which can be
|
// generates ListBucketsResponse from array of BucketInfo which can be
|
||||||
// serialized to match XML and JSON API spec output.
|
// serialized to match XML and JSON API spec output.
|
||||||
func generateListBucketsResponse(buckets []BucketInfo) ListBucketsResponse {
|
func generateListBucketsResponse(buckets []BucketInfo) ListBucketsResponse {
|
||||||
var listbuckets []Bucket
|
listbuckets := make([]Bucket, 0, len(buckets))
|
||||||
var data = ListBucketsResponse{}
|
var data = ListBucketsResponse{}
|
||||||
var owner = Owner{}
|
var owner = Owner{}
|
||||||
|
|
||||||
@ -428,8 +428,7 @@ func generateListBucketsResponse(buckets []BucketInfo) ListBucketsResponse {
|
|||||||
|
|
||||||
// generates an ListBucketVersions response for the said bucket with other enumerated options.
|
// generates an ListBucketVersions response for the said bucket with other enumerated options.
|
||||||
func generateListVersionsResponse(bucket, prefix, marker, versionIDMarker, delimiter, encodingType string, maxKeys int, resp ListObjectVersionsInfo) ListVersionsResponse {
|
func generateListVersionsResponse(bucket, prefix, marker, versionIDMarker, delimiter, encodingType string, maxKeys int, resp ListObjectVersionsInfo) ListVersionsResponse {
|
||||||
var versions []ObjectVersion
|
versions := make([]ObjectVersion, 0, len(resp.Objects))
|
||||||
var prefixes []CommonPrefix
|
|
||||||
var owner = Owner{}
|
var owner = Owner{}
|
||||||
var data = ListVersionsResponse{}
|
var data = ListVersionsResponse{}
|
||||||
|
|
||||||
@ -473,6 +472,7 @@ func generateListVersionsResponse(bucket, prefix, marker, versionIDMarker, delim
|
|||||||
data.VersionIDMarker = versionIDMarker
|
data.VersionIDMarker = versionIDMarker
|
||||||
data.IsTruncated = resp.IsTruncated
|
data.IsTruncated = resp.IsTruncated
|
||||||
|
|
||||||
|
prefixes := make([]CommonPrefix, 0, len(resp.Prefixes))
|
||||||
for _, prefix := range resp.Prefixes {
|
for _, prefix := range resp.Prefixes {
|
||||||
var prefixItem = CommonPrefix{}
|
var prefixItem = CommonPrefix{}
|
||||||
prefixItem.Prefix = s3EncodeName(prefix, encodingType)
|
prefixItem.Prefix = s3EncodeName(prefix, encodingType)
|
||||||
@ -484,8 +484,7 @@ func generateListVersionsResponse(bucket, prefix, marker, versionIDMarker, delim
|
|||||||
|
|
||||||
// generates an ListObjectsV1 response for the said bucket with other enumerated options.
|
// generates an ListObjectsV1 response for the said bucket with other enumerated options.
|
||||||
func generateListObjectsV1Response(bucket, prefix, marker, delimiter, encodingType string, maxKeys int, resp ListObjectsInfo) ListObjectsResponse {
|
func generateListObjectsV1Response(bucket, prefix, marker, delimiter, encodingType string, maxKeys int, resp ListObjectsInfo) ListObjectsResponse {
|
||||||
var contents []Object
|
contents := make([]Object, 0, len(resp.Objects))
|
||||||
var prefixes []CommonPrefix
|
|
||||||
var owner = Owner{}
|
var owner = Owner{}
|
||||||
var data = ListObjectsResponse{}
|
var data = ListObjectsResponse{}
|
||||||
|
|
||||||
@ -517,9 +516,10 @@ func generateListObjectsV1Response(bucket, prefix, marker, delimiter, encodingTy
|
|||||||
data.Marker = s3EncodeName(marker, encodingType)
|
data.Marker = s3EncodeName(marker, encodingType)
|
||||||
data.Delimiter = s3EncodeName(delimiter, encodingType)
|
data.Delimiter = s3EncodeName(delimiter, encodingType)
|
||||||
data.MaxKeys = maxKeys
|
data.MaxKeys = maxKeys
|
||||||
|
|
||||||
data.NextMarker = s3EncodeName(resp.NextMarker, encodingType)
|
data.NextMarker = s3EncodeName(resp.NextMarker, encodingType)
|
||||||
data.IsTruncated = resp.IsTruncated
|
data.IsTruncated = resp.IsTruncated
|
||||||
|
|
||||||
|
prefixes := make([]CommonPrefix, 0, len(resp.Prefixes))
|
||||||
for _, prefix := range resp.Prefixes {
|
for _, prefix := range resp.Prefixes {
|
||||||
var prefixItem = CommonPrefix{}
|
var prefixItem = CommonPrefix{}
|
||||||
prefixItem.Prefix = s3EncodeName(prefix, encodingType)
|
prefixItem.Prefix = s3EncodeName(prefix, encodingType)
|
||||||
@ -531,8 +531,7 @@ func generateListObjectsV1Response(bucket, prefix, marker, delimiter, encodingTy
|
|||||||
|
|
||||||
// generates an ListObjectsV2 response for the said bucket with other enumerated options.
|
// generates an ListObjectsV2 response for the said bucket with other enumerated options.
|
||||||
func generateListObjectsV2Response(bucket, prefix, token, nextToken, startAfter, delimiter, encodingType string, fetchOwner, isTruncated bool, maxKeys int, objects []ObjectInfo, prefixes []string, metadata bool) ListObjectsV2Response {
|
func generateListObjectsV2Response(bucket, prefix, token, nextToken, startAfter, delimiter, encodingType string, fetchOwner, isTruncated bool, maxKeys int, objects []ObjectInfo, prefixes []string, metadata bool) ListObjectsV2Response {
|
||||||
var contents []Object
|
contents := make([]Object, 0, len(objects))
|
||||||
var commonPrefixes []CommonPrefix
|
|
||||||
var owner = Owner{}
|
var owner = Owner{}
|
||||||
var data = ListObjectsV2Response{}
|
var data = ListObjectsV2Response{}
|
||||||
|
|
||||||
@ -585,6 +584,8 @@ func generateListObjectsV2Response(bucket, prefix, token, nextToken, startAfter,
|
|||||||
data.ContinuationToken = base64.StdEncoding.EncodeToString([]byte(token))
|
data.ContinuationToken = base64.StdEncoding.EncodeToString([]byte(token))
|
||||||
data.NextContinuationToken = base64.StdEncoding.EncodeToString([]byte(nextToken))
|
data.NextContinuationToken = base64.StdEncoding.EncodeToString([]byte(nextToken))
|
||||||
data.IsTruncated = isTruncated
|
data.IsTruncated = isTruncated
|
||||||
|
|
||||||
|
commonPrefixes := make([]CommonPrefix, 0, len(prefixes))
|
||||||
for _, prefix := range prefixes {
|
for _, prefix := range prefixes {
|
||||||
var prefixItem = CommonPrefix{}
|
var prefixItem = CommonPrefix{}
|
||||||
prefixItem.Prefix = s3EncodeName(prefix, encodingType)
|
prefixItem.Prefix = s3EncodeName(prefix, encodingType)
|
||||||
|
@ -637,8 +637,8 @@ func (z *erasureZones) ListObjectsV2(ctx context.Context, bucket, prefix, contin
|
|||||||
|
|
||||||
func (z *erasureZones) listObjectsNonSlash(ctx context.Context, bucket, prefix, marker, delimiter string, maxKeys int) (loi ListObjectsInfo, err error) {
|
func (z *erasureZones) listObjectsNonSlash(ctx context.Context, bucket, prefix, marker, delimiter string, maxKeys int) (loi ListObjectsInfo, err error) {
|
||||||
|
|
||||||
var zonesEntryChs [][]FileInfoCh
|
zonesEntryChs := make([][]FileInfoCh, 0, len(z.zones))
|
||||||
var zonesListTolerancePerSet []int
|
zonesListTolerancePerSet := make([]int, 0, len(z.zones))
|
||||||
|
|
||||||
endWalkCh := make(chan struct{})
|
endWalkCh := make(chan struct{})
|
||||||
defer close(endWalkCh)
|
defer close(endWalkCh)
|
||||||
@ -653,8 +653,8 @@ func (z *erasureZones) listObjectsNonSlash(ctx context.Context, bucket, prefix,
|
|||||||
var eof bool
|
var eof bool
|
||||||
var prevPrefix string
|
var prevPrefix string
|
||||||
|
|
||||||
var zonesEntriesInfos [][]FileInfo
|
zonesEntriesInfos := make([][]FileInfo, 0, len(zonesEntryChs))
|
||||||
var zonesEntriesValid [][]bool
|
zonesEntriesValid := make([][]bool, 0, len(zonesEntryChs))
|
||||||
for _, entryChs := range zonesEntryChs {
|
for _, entryChs := range zonesEntryChs {
|
||||||
zonesEntriesInfos = append(zonesEntriesInfos, make([]FileInfo, len(entryChs)))
|
zonesEntriesInfos = append(zonesEntriesInfos, make([]FileInfo, len(entryChs)))
|
||||||
zonesEntriesValid = append(zonesEntriesValid, make([]bool, len(entryChs)))
|
zonesEntriesValid = append(zonesEntriesValid, make([]bool, len(entryChs)))
|
||||||
@ -756,9 +756,9 @@ func (z *erasureZones) listObjectsSplunk(ctx context.Context, bucket, prefix, ma
|
|||||||
|
|
||||||
recursive := true
|
recursive := true
|
||||||
|
|
||||||
var zonesEntryChs [][]FileInfoCh
|
zonesEntryChs := make([][]FileInfoCh, 0, len(z.zones))
|
||||||
var zonesEndWalkCh []chan struct{}
|
zonesEndWalkCh := make([]chan struct{}, 0, len(z.zones))
|
||||||
var zonesListTolerancePerSet []int
|
zonesListTolerancePerSet := make([]int, 0, len(z.zones))
|
||||||
|
|
||||||
for _, zone := range z.zones {
|
for _, zone := range z.zones {
|
||||||
entryChs, endWalkCh := zone.poolSplunk.Release(listParams{bucket, recursive, marker, prefix})
|
entryChs, endWalkCh := zone.poolSplunk.Release(listParams{bucket, recursive, marker, prefix})
|
||||||
@ -848,9 +848,9 @@ func (z *erasureZones) listObjects(ctx context.Context, bucket, prefix, marker,
|
|||||||
recursive = false
|
recursive = false
|
||||||
}
|
}
|
||||||
|
|
||||||
var zonesEntryChs [][]FileInfoCh
|
zonesEntryChs := make([][]FileInfoCh, 0, len(z.zones))
|
||||||
var zonesEndWalkCh []chan struct{}
|
zonesEndWalkCh := make([]chan struct{}, 0, len(z.zones))
|
||||||
var zonesListTolerancePerSet []int
|
zonesListTolerancePerSet := make([]int, 0, len(z.zones))
|
||||||
|
|
||||||
for _, zone := range z.zones {
|
for _, zone := range z.zones {
|
||||||
entryChs, endWalkCh := zone.pool.Release(listParams{bucket, recursive, marker, prefix})
|
entryChs, endWalkCh := zone.pool.Release(listParams{bucket, recursive, marker, prefix})
|
||||||
@ -1051,8 +1051,8 @@ func lexicallySortedEntryZoneVersions(zoneEntryChs [][]FileInfoVersionsCh, zoneE
|
|||||||
// mergeZonesEntriesVersionsCh - merges FileInfoVersions channel to entries upto maxKeys.
|
// mergeZonesEntriesVersionsCh - merges FileInfoVersions channel to entries upto maxKeys.
|
||||||
func mergeZonesEntriesVersionsCh(zonesEntryChs [][]FileInfoVersionsCh, maxKeys int, zonesListTolerancePerSet []int) (entries FilesInfoVersions) {
|
func mergeZonesEntriesVersionsCh(zonesEntryChs [][]FileInfoVersionsCh, maxKeys int, zonesListTolerancePerSet []int) (entries FilesInfoVersions) {
|
||||||
var i = 0
|
var i = 0
|
||||||
var zonesEntriesInfos [][]FileInfoVersions
|
zonesEntriesInfos := make([][]FileInfoVersions, 0, len(zonesEntryChs))
|
||||||
var zonesEntriesValid [][]bool
|
zonesEntriesValid := make([][]bool, 0, len(zonesEntryChs))
|
||||||
for _, entryChs := range zonesEntryChs {
|
for _, entryChs := range zonesEntryChs {
|
||||||
zonesEntriesInfos = append(zonesEntriesInfos, make([]FileInfoVersions, len(entryChs)))
|
zonesEntriesInfos = append(zonesEntriesInfos, make([]FileInfoVersions, len(entryChs)))
|
||||||
zonesEntriesValid = append(zonesEntriesValid, make([]bool, len(entryChs)))
|
zonesEntriesValid = append(zonesEntriesValid, make([]bool, len(entryChs)))
|
||||||
@ -1082,8 +1082,8 @@ func mergeZonesEntriesVersionsCh(zonesEntryChs [][]FileInfoVersionsCh, maxKeys i
|
|||||||
// mergeZonesEntriesCh - merges FileInfo channel to entries upto maxKeys.
|
// mergeZonesEntriesCh - merges FileInfo channel to entries upto maxKeys.
|
||||||
func mergeZonesEntriesCh(zonesEntryChs [][]FileInfoCh, maxKeys int, zonesListTolerancePerSet []int) (entries FilesInfo) {
|
func mergeZonesEntriesCh(zonesEntryChs [][]FileInfoCh, maxKeys int, zonesListTolerancePerSet []int) (entries FilesInfo) {
|
||||||
var i = 0
|
var i = 0
|
||||||
var zonesEntriesInfos [][]FileInfo
|
zonesEntriesInfos := make([][]FileInfo, 0, len(zonesEntryChs))
|
||||||
var zonesEntriesValid [][]bool
|
zonesEntriesValid := make([][]bool, 0, len(zonesEntryChs))
|
||||||
for _, entryChs := range zonesEntryChs {
|
for _, entryChs := range zonesEntryChs {
|
||||||
zonesEntriesInfos = append(zonesEntriesInfos, make([]FileInfo, len(entryChs)))
|
zonesEntriesInfos = append(zonesEntriesInfos, make([]FileInfo, len(entryChs)))
|
||||||
zonesEntriesValid = append(zonesEntriesValid, make([]bool, len(entryChs)))
|
zonesEntriesValid = append(zonesEntriesValid, make([]bool, len(entryChs)))
|
||||||
@ -1218,9 +1218,9 @@ func (z *erasureZones) listObjectVersions(ctx context.Context, bucket, prefix, m
|
|||||||
recursive = false
|
recursive = false
|
||||||
}
|
}
|
||||||
|
|
||||||
var zonesEntryChs [][]FileInfoVersionsCh
|
zonesEntryChs := make([][]FileInfoVersionsCh, 0, len(z.zones))
|
||||||
var zonesEndWalkCh []chan struct{}
|
zonesEndWalkCh := make([]chan struct{}, 0, len(z.zones))
|
||||||
var zonesListTolerancePerSet []int
|
zonesListTolerancePerSet := make([]int, 0, len(z.zones))
|
||||||
for _, zone := range z.zones {
|
for _, zone := range z.zones {
|
||||||
entryChs, endWalkCh := zone.poolVersions.Release(listParams{bucket, recursive, marker, prefix})
|
entryChs, endWalkCh := zone.poolVersions.Release(listParams{bucket, recursive, marker, prefix})
|
||||||
if entryChs == nil {
|
if entryChs == nil {
|
||||||
@ -1737,18 +1737,15 @@ func (z *erasureZones) Walk(ctx context.Context, bucket, prefix string, results
|
|||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
var zonesEntryChs [][]FileInfoCh
|
zonesEntryChs := make([][]FileInfoCh, 0, len(z.zones))
|
||||||
|
zoneDrivesPerSet := make([]int, 0, len(z.zones))
|
||||||
for _, zone := range z.zones {
|
for _, zone := range z.zones {
|
||||||
zonesEntryChs = append(zonesEntryChs, zone.startMergeWalks(ctx, bucket, prefix, "", true, ctx.Done()))
|
zonesEntryChs = append(zonesEntryChs, zone.startMergeWalks(ctx, bucket, prefix, "", true, ctx.Done()))
|
||||||
}
|
|
||||||
|
|
||||||
var zoneDrivesPerSet []int
|
|
||||||
for _, zone := range z.zones {
|
|
||||||
zoneDrivesPerSet = append(zoneDrivesPerSet, zone.setDriveCount)
|
zoneDrivesPerSet = append(zoneDrivesPerSet, zone.setDriveCount)
|
||||||
}
|
}
|
||||||
|
|
||||||
var zonesEntriesInfos [][]FileInfo
|
zonesEntriesInfos := make([][]FileInfo, 0, len(zonesEntryChs))
|
||||||
var zonesEntriesValid [][]bool
|
zonesEntriesValid := make([][]bool, 0, len(zonesEntryChs))
|
||||||
for _, entryChs := range zonesEntryChs {
|
for _, entryChs := range zonesEntryChs {
|
||||||
zonesEntriesInfos = append(zonesEntriesInfos, make([]FileInfo, len(entryChs)))
|
zonesEntriesInfos = append(zonesEntriesInfos, make([]FileInfo, len(entryChs)))
|
||||||
zonesEntriesValid = append(zonesEntriesValid, make([]bool, len(entryChs)))
|
zonesEntriesValid = append(zonesEntriesValid, make([]bool, len(entryChs)))
|
||||||
@ -1779,23 +1776,20 @@ func (z *erasureZones) Walk(ctx context.Context, bucket, prefix string, results
|
|||||||
type HealObjectFn func(bucket, object, versionID string) error
|
type HealObjectFn func(bucket, object, versionID string) error
|
||||||
|
|
||||||
func (z *erasureZones) HealObjects(ctx context.Context, bucket, prefix string, opts madmin.HealOpts, healObject HealObjectFn) error {
|
func (z *erasureZones) HealObjects(ctx context.Context, bucket, prefix string, opts madmin.HealOpts, healObject HealObjectFn) error {
|
||||||
var zonesEntryChs [][]FileInfoVersionsCh
|
|
||||||
|
|
||||||
endWalkCh := make(chan struct{})
|
endWalkCh := make(chan struct{})
|
||||||
defer close(endWalkCh)
|
defer close(endWalkCh)
|
||||||
|
|
||||||
|
zonesEntryChs := make([][]FileInfoVersionsCh, 0, len(z.zones))
|
||||||
|
zoneDrivesPerSet := make([]int, 0, len(z.zones))
|
||||||
|
|
||||||
for _, zone := range z.zones {
|
for _, zone := range z.zones {
|
||||||
zonesEntryChs = append(zonesEntryChs,
|
zonesEntryChs = append(zonesEntryChs,
|
||||||
zone.startMergeWalksVersions(ctx, bucket, prefix, "", true, endWalkCh))
|
zone.startMergeWalksVersions(ctx, bucket, prefix, "", true, endWalkCh))
|
||||||
}
|
|
||||||
|
|
||||||
var zoneDrivesPerSet []int
|
|
||||||
for _, zone := range z.zones {
|
|
||||||
zoneDrivesPerSet = append(zoneDrivesPerSet, zone.setDriveCount)
|
zoneDrivesPerSet = append(zoneDrivesPerSet, zone.setDriveCount)
|
||||||
}
|
}
|
||||||
|
|
||||||
var zonesEntriesInfos [][]FileInfoVersions
|
zonesEntriesInfos := make([][]FileInfoVersions, 0, len(zonesEntryChs))
|
||||||
var zonesEntriesValid [][]bool
|
zonesEntriesValid := make([][]bool, 0, len(zonesEntryChs))
|
||||||
for _, entryChs := range zonesEntryChs {
|
for _, entryChs := range zonesEntryChs {
|
||||||
zonesEntriesInfos = append(zonesEntriesInfos, make([]FileInfoVersions, len(entryChs)))
|
zonesEntriesInfos = append(zonesEntriesInfos, make([]FileInfoVersions, len(entryChs)))
|
||||||
zonesEntriesValid = append(zonesEntriesValid, make([]bool, len(entryChs)))
|
zonesEntriesValid = append(zonesEntriesValid, make([]bool, len(entryChs)))
|
||||||
|
@ -502,13 +502,13 @@ func (fs *FSObjects) ListBuckets(ctx context.Context) ([]BucketInfo, error) {
|
|||||||
atomic.AddInt64(&fs.activeIOCount, -1)
|
atomic.AddInt64(&fs.activeIOCount, -1)
|
||||||
}()
|
}()
|
||||||
|
|
||||||
var bucketInfos []BucketInfo
|
|
||||||
entries, err := readDir(fs.fsPath)
|
entries, err := readDir(fs.fsPath)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
logger.LogIf(ctx, errDiskNotFound)
|
logger.LogIf(ctx, errDiskNotFound)
|
||||||
return nil, toObjectErr(errDiskNotFound)
|
return nil, toObjectErr(errDiskNotFound)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bucketInfos := make([]BucketInfo, 0, len(entries))
|
||||||
for _, entry := range entries {
|
for _, entry := range entries {
|
||||||
// Ignore all reserved bucket names and invalid bucket names.
|
// Ignore all reserved bucket names and invalid bucket names.
|
||||||
if isReservedOrInvalidBucket(entry, false) {
|
if isReservedOrInvalidBucket(entry, false) {
|
||||||
|
@ -2557,7 +2557,7 @@ func (api objectAPIHandlers) CompleteMultipartUploadHandler(w http.ResponseWrite
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Complete parts.
|
// Complete parts.
|
||||||
var completeParts []CompletePart
|
completeParts := make([]CompletePart, 0, len(complMultipartUpload.Parts))
|
||||||
for _, part := range complMultipartUpload.Parts {
|
for _, part := range complMultipartUpload.Parts {
|
||||||
part.ETag = canonicalizeETag(part.ETag)
|
part.ETag = canonicalizeETag(part.ETag)
|
||||||
if isEncrypted {
|
if isEncrypted {
|
||||||
|
@ -829,8 +829,9 @@ func (client *peerRESTClient) ConsoleLog(logCh chan interface{}, doneCh <-chan s
|
|||||||
}
|
}
|
||||||
|
|
||||||
func getRemoteHosts(endpointZones EndpointZones) []*xnet.Host {
|
func getRemoteHosts(endpointZones EndpointZones) []*xnet.Host {
|
||||||
var remoteHosts []*xnet.Host
|
peers := GetRemotePeers(endpointZones)
|
||||||
for _, hostStr := range GetRemotePeers(endpointZones) {
|
remoteHosts := make([]*xnet.Host, 0, len(peers))
|
||||||
|
for _, hostStr := range peers {
|
||||||
host, err := xnet.ParseHost(hostStr)
|
host, err := xnet.ParseHost(hostStr)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
logger.LogIf(GlobalContext, err)
|
logger.LogIf(GlobalContext, err)
|
||||||
|
@ -47,7 +47,7 @@ func (s *peerRESTServer) GetLocksHandler(w http.ResponseWriter, r *http.Request)
|
|||||||
|
|
||||||
ctx := newContext(r, w, "GetLocks")
|
ctx := newContext(r, w, "GetLocks")
|
||||||
|
|
||||||
var llockers []map[string][]lockRequesterInfo
|
llockers := make([]map[string][]lockRequesterInfo, 0, len(globalLockServers))
|
||||||
for _, llocker := range globalLockServers {
|
for _, llocker := range globalLockServers {
|
||||||
llockers = append(llockers, llocker.DupLockMap())
|
llockers = append(llockers, llocker.DupLockMap())
|
||||||
}
|
}
|
||||||
|
@ -654,7 +654,7 @@ func listVols(dirPath string) ([]VolInfo, error) {
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, errDiskNotFound
|
return nil, errDiskNotFound
|
||||||
}
|
}
|
||||||
var volsInfo []VolInfo
|
volsInfo := make([]VolInfo, 0, len(entries))
|
||||||
for _, entry := range entries {
|
for _, entry := range entries {
|
||||||
if !HasSuffix(entry, SlashSeparator) || !isValidVolname(slashpath.Clean(entry)) {
|
if !HasSuffix(entry, SlashSeparator) || !isValidVolname(slashpath.Clean(entry)) {
|
||||||
// Skip if entry is neither a directory not a valid volume name.
|
// Skip if entry is neither a directory not a valid volume name.
|
||||||
|
Loading…
x
Reference in New Issue
Block a user