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 e48412cbf..8ce71b80d 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,7 +1151,11 @@ func (m *Map) batchLookupCmd(cmd sys.Cmd, cursor *MapBatchCursor, count int, key return 0, sysErr } - if err := keyBuf.Unmarshal(keysOut); err != nil { + if attr.Count == 0 { + return int(attr.Count), sysErr + } + + if err := keyBuf.UnmarshalWithLimit(keysOut, int(attr.Count)*int(m.keySize)); err != nil { return 0, err }