From 4e63057c0fd0ebcc9040c161ad69c7e56d57cf82 Mon Sep 17 00:00:00 2001 From: Erik Dubbelboer Date: Sat, 26 Dec 2020 16:53:48 +0100 Subject: [PATCH] Make argsKV more predictable Fixes #932 --- args.go | 10 +++++++++- args_test.go | 26 +++++++++++++++++++++++++- 2 files changed, 34 insertions(+), 2 deletions(-) diff --git a/args.go b/args.go index d1e57cf674..07600f9dc3 100644 --- a/args.go +++ b/args.go @@ -361,7 +361,13 @@ func visitArgs(args []argsKV, f func(k, v []byte)) { func copyArgs(dst, src []argsKV) []argsKV { if cap(dst) < len(src) { tmp := make([]argsKV, len(src)) + dst = dst[:cap(dst)] // copy all of dst. copy(tmp, dst) + for i := len(dst); i < len(tmp); i++ { + // Make sure nothing is nil. + tmp[i].key = []byte{} + tmp[i].value = []byte{} + } dst = tmp } n := len(src) @@ -442,7 +448,9 @@ func allocArg(h []argsKV) ([]argsKV, *argsKV) { if cap(h) > n { h = h[:n+1] } else { - h = append(h, argsKV{}) + h = append(h, argsKV{ + value: []byte{}, + }) } return h, &h[n] } diff --git a/args_test.go b/args_test.go index b2e195415a..c780c3bfed 100644 --- a/args_test.go +++ b/args_test.go @@ -596,4 +596,28 @@ func TestArgsDeleteAll(t *testing.T) { if a.Len() != 1 || a.Has("q1") { t.Fatalf("Expected q1 arg to be completely deleted. Current Args: %s", a.String()) } -} \ No newline at end of file +} + +func TestIssue932(t *testing.T) { + t.Parallel() + var a []argsKV + + a = setArg(a, "t1", "ok", argsHasValue) + a = setArg(a, "t2", "", argsHasValue) + a = setArg(a, "t1", "", argsHasValue) + a = setArgBytes(a, s2b("t3"), []byte{}, argsHasValue) + a = setArgBytes(a, s2b("t4"), nil, argsHasValue) + + if peekArgStr(a, "t1") == nil { + t.Error("nil not expected for t1") + } + if peekArgStr(a, "t2") == nil { + t.Error("nil not expected for t2") + } + if peekArgStr(a, "t3") == nil { + t.Error("nil not expected for t3") + } + if peekArgStr(a, "t4") != nil { + t.Error("nil expected for t4") + } +}