From f3f9718f501f72ebfbd6ecf9ad6cf77f0e561c75 Mon Sep 17 00:00:00 2001 From: Marks Polakovs Date: Fri, 25 Mar 2022 01:40:07 +0000 Subject: [PATCH] fix: ensure globbed FileInfo always has correct size (#482) When globbing a file that has a FileInfo set, we would reuse the pointer to the original file's FileInfo even if the matched files' sizes are different, causing deb to error when writing the data file due to mismatching sizes. Copy the FileInfo and recalculate its size when globbing. Add a test case to check this scenario. Fixes #316. --- files/files.go | 9 +++++++- files/files_test.go | 23 +++++++++++++++++++ .../testdata/globtest/different-sizes/a/a.txt | 1 + .../testdata/globtest/different-sizes/b/b.txt | 1 + 4 files changed, 33 insertions(+), 1 deletion(-) create mode 100644 files/testdata/globtest/different-sizes/a/a.txt create mode 100644 files/testdata/globtest/different-sizes/b/b.txt diff --git a/files/files.go b/files/files.go index 9fcf422..1d85755 100644 --- a/files/files.go +++ b/files/files.go @@ -177,11 +177,18 @@ func ExpandContentGlobs(contents Contents, disableGlobbing bool) (files Contents func appendGlobbedFiles(all Contents, globbed map[string]string, origFile *Content) (Contents, error) { for src, dst := range globbed { + // if the file has a FileInfo, we need to copy it but recalculate its size + newFileInfo := origFile.FileInfo + if newFileInfo != nil { + newFileInfoVal := *newFileInfo + newFileInfoVal.Size = 0 + newFileInfo = &newFileInfoVal + } newFile := (&Content{ Destination: ToNixPath(dst), Source: ToNixPath(src), Type: origFile.Type, - FileInfo: origFile.FileInfo, + FileInfo: newFileInfo, Packager: origFile.Packager, }).WithFileInfoDefaults() if dst, err := os.Readlink(src); err == nil { diff --git a/files/files_test.go b/files/files_test.go index 9cae87d..2166267 100644 --- a/files/files_test.go +++ b/files/files_test.go @@ -347,3 +347,26 @@ func TestGlobbingWhenFilesHaveBrackets(t *testing.T) { } } } + +func TestGlobbingFilesWithDifferentSizesWithFileInfo(t *testing.T) { + result, err := files.ExpandContentGlobs(files.Contents{ + { + Source: "./testdata/globtest/different-sizes/**/*", + Destination: ".", + FileInfo: &files.ContentFileInfo{ + Mode: 0o777, + }, + }, + }, false) + if err != nil { + t.Fatalf("expand content globs: %v", err) + } + + if len(result) != 2 { + t.Fatalf("unexpected result length: %d, expected 2", len(result)) + } + + if result[0].FileInfo.Size == result[1].FileInfo.Size { + t.Fatal("test FileInfos have the same size, expected different") + } +} diff --git a/files/testdata/globtest/different-sizes/a/a.txt b/files/testdata/globtest/different-sizes/a/a.txt new file mode 100644 index 0000000..257cc56 --- /dev/null +++ b/files/testdata/globtest/different-sizes/a/a.txt @@ -0,0 +1 @@ +foo diff --git a/files/testdata/globtest/different-sizes/b/b.txt b/files/testdata/globtest/different-sizes/b/b.txt new file mode 100644 index 0000000..15564c6 --- /dev/null +++ b/files/testdata/globtest/different-sizes/b/b.txt @@ -0,0 +1 @@ +barbaz