From ddc0380b5c058270d53a8776e1b0e9cf99fa0f78 Mon Sep 17 00:00:00 2001 From: Neil Macneale IV Date: Thu, 29 May 2025 10:58:44 -0700 Subject: [PATCH 1/4] Ensure file manifests have non-empty data before writing to disk --- go/store/nbs/file_manifest.go | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/go/store/nbs/file_manifest.go b/go/store/nbs/file_manifest.go index 970e7dcdfe0..72e82acf921 100644 --- a/go/store/nbs/file_manifest.go +++ b/go/store/nbs/file_manifest.go @@ -296,6 +296,16 @@ func parseManifest(r io.Reader) (manifestContents, error) { } func writeManifest(temp io.Writer, contents manifestContents) error { + if len(contents.nbfVers) == 0 { + return errors.New("runtime error: Noms format version cannot be empty") + } + if contents.lock.IsEmpty() { + return errors.New("runtime error: Lock hash cannot be empty") + } + if contents.root.IsEmpty() { + return errors.New("runtime error: Root hash cannot be empty") + } + strs := make([]string, 2*len(contents.specs)+prefixLen) strs[0], strs[1], strs[2], strs[3], strs[4] = StorageVersion, contents.nbfVers, contents.lock.String(), contents.root.String(), contents.gcGen.String() tableInfo := strs[prefixLen:] From 37d01955706182111066639cff66c3d5a8167a73 Mon Sep 17 00:00:00 2001 From: Neil Macneale IV Date: Thu, 29 May 2025 11:59:26 -0700 Subject: [PATCH 2/4] To aggresive on check. empty roots are a thing --- go/store/nbs/file_manifest.go | 3 --- 1 file changed, 3 deletions(-) diff --git a/go/store/nbs/file_manifest.go b/go/store/nbs/file_manifest.go index 72e82acf921..07bb41148a0 100644 --- a/go/store/nbs/file_manifest.go +++ b/go/store/nbs/file_manifest.go @@ -302,9 +302,6 @@ func writeManifest(temp io.Writer, contents manifestContents) error { if contents.lock.IsEmpty() { return errors.New("runtime error: Lock hash cannot be empty") } - if contents.root.IsEmpty() { - return errors.New("runtime error: Root hash cannot be empty") - } strs := make([]string, 2*len(contents.specs)+prefixLen) strs[0], strs[1], strs[2], strs[3], strs[4] = StorageVersion, contents.nbfVers, contents.lock.String(), contents.root.String(), contents.gcGen.String() From 780975b40dff58a3e9f9e13905645313415d1b88 Mon Sep 17 00:00:00 2001 From: Neil Macneale IV Date: Thu, 29 May 2025 15:16:42 -0700 Subject: [PATCH 3/4] Provide valid manifest contents in test --- go/store/nbs/store_test.go | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/go/store/nbs/store_test.go b/go/store/nbs/store_test.go index 69c2369a7b5..3810de719d2 100644 --- a/go/store/nbs/store_test.go +++ b/go/store/nbs/store_test.go @@ -27,6 +27,7 @@ import ( "testing" "time" + "github.com/dolthub/dolt/go/store/constants" "github.com/google/uuid" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" @@ -49,7 +50,10 @@ func makeTestLocalStore(t *testing.T, maxTableFiles int) (st *NomsBlockStore, no // create a v5 manifest fm, err := getFileManifest(ctx, nomsDir, asyncFlush) require.NoError(t, err) - _, err = fm.Update(ctx, hash.Hash{}, manifestContents{}, &Stats{}, nil) + _, err = fm.Update(ctx, hash.Hash{}, manifestContents{ + nbfVers: constants.FormatDoltString, + lock: journalAddr, // Any valid address will do here + }, &Stats{}, nil) require.NoError(t, err) q = NewUnlimitedMemQuotaProvider() From 862f22be999a10ffcd374e1b167fe17ee025666f Mon Sep 17 00:00:00 2001 From: macneale4 Date: Thu, 29 May 2025 22:25:08 +0000 Subject: [PATCH 4/4] [ga-format-pr] Run go/utils/repofmt/format_repo.sh and go/Godeps/update.sh --- go/store/nbs/store_test.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/go/store/nbs/store_test.go b/go/store/nbs/store_test.go index 3810de719d2..34ff14c1c3f 100644 --- a/go/store/nbs/store_test.go +++ b/go/store/nbs/store_test.go @@ -27,7 +27,6 @@ import ( "testing" "time" - "github.com/dolthub/dolt/go/store/constants" "github.com/google/uuid" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" @@ -36,6 +35,7 @@ import ( "github.com/dolthub/dolt/go/libraries/utils/set" "github.com/dolthub/dolt/go/libraries/utils/test" "github.com/dolthub/dolt/go/store/chunks" + "github.com/dolthub/dolt/go/store/constants" "github.com/dolthub/dolt/go/store/hash" "github.com/dolthub/dolt/go/store/types" "github.com/dolthub/dolt/go/store/util/tempfiles"