From efc7f6d94d08ad8e030cf2a705625054266fd889 Mon Sep 17 00:00:00 2001 From: Arran Walker Date: Sun, 12 Sep 2021 00:21:34 +0100 Subject: [PATCH] Fix buffer size limit --- archiver_options.go | 8 +++++++- archiver_test.go | 47 +++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 54 insertions(+), 1 deletion(-) diff --git a/archiver_options.go b/archiver_options.go index 8bbbea4..8ef4533 100644 --- a/archiver_options.go +++ b/archiver_options.go @@ -4,7 +4,10 @@ import ( "errors" ) -var ErrMinConcurrency = errors.New("concurrency must be at least 1") +var ( + ErrMinConcurrency = errors.New("concurrency must be at least 1") + ErrMinBufferSize = errors.New("buffer size option cannot be less than -1") +) // ArchiverOption is an option used when creating an archiver. type ArchiverOption func(*archiverOptions) error @@ -47,6 +50,9 @@ func WithArchiverConcurrency(n int) ArchiverOption { // written to temporary files before being written back to the zip file. func WithArchiverBufferSize(n int) ArchiverOption { return func(o *archiverOptions) error { + if n < -1 { + return ErrMinBufferSize + } o.bufferSize = n return nil } diff --git a/archiver_test.go b/archiver_test.go index e0d1fab..9fd2c21 100644 --- a/archiver_test.go +++ b/archiver_test.go @@ -301,6 +301,53 @@ func TestArchiveWithConcurrency(t *testing.T) { } } +func TestArchiveWithBufferSize(t *testing.T) { + testFiles := map[string]testFile{ + "foo.go": {mode: 0666}, + "bar.go": {mode: 0666}, + } + + tests := []struct { + buffersize int + pass bool + }{ + {-100, false}, + {-2, false}, + {-1, true}, + {0, true}, + {32 * 1024, true}, + {64 * 1024, true}, + } + + files, dir := testCreateFiles(t, testFiles) + defer os.RemoveAll(dir) + + for _, test := range tests { + func() { + f, err := ioutil.TempFile("", "fastzip-test") + require.NoError(t, err) + defer os.Remove(f.Name()) + defer f.Close() + + a, err := NewArchiver(f, dir, WithArchiverBufferSize(test.buffersize)) + if !test.pass { + require.Error(t, err) + return + } + + require.NoError(t, err) + require.NoError(t, a.Archive(context.Background(), files)) + require.NoError(t, a.Close()) + + bytes, entries := a.Written() + require.EqualValues(t, 0, bytes) + require.EqualValues(t, 3, entries) + + testExtract(t, f.Name(), testFiles) + }() + } +} + func TestArchiveChroot(t *testing.T) { dir, err := ioutil.TempDir("", "fastzip-test") require.NoError(t, err)