From 2e7482cb8958ee07d6ce538e777fea518bbda48a Mon Sep 17 00:00:00 2001 From: Flavian Missi Date: Mon, 14 Oct 2024 14:39:44 +0200 Subject: [PATCH] avoid appending directory as file path in s3 driver Walk when a directory is empty, the s3 api lists it with a trailing slash. this causes the path to be appended twice to the walkInfo slice, causing purge uploads path transformations to panic when the `_uploads` is emtpy. this adds a check for file paths ending on slash, and do not append those as regular files to the walkInfo slice. fixes #4358 Signed-off-by: Flavian Missi --- registry/storage/driver/s3-aws/s3.go | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/registry/storage/driver/s3-aws/s3.go b/registry/storage/driver/s3-aws/s3.go index 48db5f4a199..11822a0b23d 100644 --- a/registry/storage/driver/s3-aws/s3.go +++ b/registry/storage/driver/s3-aws/s3.go @@ -1178,6 +1178,16 @@ func (d *driver) doWalk(parentCtx context.Context, objectCount *int64, from stri prevDir = dir } + // in some cases the _uploads dir might be empty. when this happens, it would + // be appended twice to the walkInfos slice, once as [...]/_uploads and + // once more erroneously as [...]/_uploads/. the easiest way to avoid this is + // to skip appending filePath to walkInfos if it ends in "/". the loop through + // dirs will already have handled it in that case, so it's safe to continue this + // loop. + if strings.HasSuffix(filePath, "/") { + continue + } + walkInfos = append(walkInfos, storagedriver.FileInfoInternal{ FileInfoFields: storagedriver.FileInfoFields{ IsDir: false, @@ -1541,6 +1551,7 @@ func (w *writer) Write(p []byte) (int, error) { func (w *writer) Size() int64 { return w.size } + func (w *writer) Close() error { if w.closed { return fmt.Errorf("already closed")