From 278ac23ba89b9d8fa1435ed3ee44890b5a31a745 Mon Sep 17 00:00:00 2001 From: Florian Lehner Date: Sat, 13 Jul 2024 17:30:00 +0200 Subject: [PATCH 1/2] map: skip unmarshal if attr.Count == 0 Signed-off-by: Florian Lehner --- map.go | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/map.go b/map.go index e48412cbf..dcbd34610 100644 --- a/map.go +++ b/map.go @@ -1061,6 +1061,10 @@ func (m *Map) batchLookup(cmd sys.Cmd, cursor *MapBatchCursor, keysOut, valuesOu return n, err } + if n == 0 { + return n, nil + } + err = valueBuf.Unmarshal(valuesOut) if err != nil { return 0, err @@ -1083,6 +1087,10 @@ func (m *Map) batchLookupPerCPU(cmd sys.Cmd, cursor *MapBatchCursor, keysOut, va return 0, err } + if n == 0 { + return n, sysErr + } + err = unmarshalBatchPerCPUValue(valuesOut, count, int(m.valueSize), valueBuf) if err != nil { return 0, err @@ -1143,6 +1151,10 @@ func (m *Map) batchLookupCmd(cmd sys.Cmd, cursor *MapBatchCursor, count int, key return 0, sysErr } + if attr.Count == 0 { + return int(attr.Count), sysErr + } + if err := keyBuf.Unmarshal(keysOut); err != nil { return 0, err } From edd4250fbdfb368b0f30e92959aecfad796a9a21 Mon Sep 17 00:00:00 2001 From: Florian Lehner Date: Sat, 13 Jul 2024 17:31:59 +0200 Subject: [PATCH 2/2] map: allow partial unmarshaling Signed-off-by: Florian Lehner --- internal/sysenc/buffer.go | 9 ++++++++- map.go | 2 +- 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/internal/sysenc/buffer.go b/internal/sysenc/buffer.go index d184ea196..4034bd373 100644 --- a/internal/sysenc/buffer.go +++ b/internal/sysenc/buffer.go @@ -68,10 +68,17 @@ func (b Buffer) Pointer() sys.Pointer { // Unmarshal the buffer into the provided value. func (b Buffer) Unmarshal(data any) error { + return b.UnmarshalWithLimit(data, b.size) +} + +// UnmarshalWithLimit unmarshals the buffer up to limit into the provided value. +func (b Buffer) UnmarshalWithLimit(data any, limit int) error { if b.size == syscallPointerOnly { return nil } - + if b.size != limit { + return Unmarshal(data, b.unsafeBytes()[:limit]) + } return Unmarshal(data, b.unsafeBytes()) } diff --git a/map.go b/map.go index dcbd34610..8ce71b80d 100644 --- a/map.go +++ b/map.go @@ -1155,7 +1155,7 @@ func (m *Map) batchLookupCmd(cmd sys.Cmd, cursor *MapBatchCursor, count int, key return int(attr.Count), sysErr } - if err := keyBuf.Unmarshal(keysOut); err != nil { + if err := keyBuf.UnmarshalWithLimit(keysOut, int(attr.Count)*int(m.keySize)); err != nil { return 0, err }