diff --git a/arrow/array/bufferbuilder.go b/arrow/array/bufferbuilder.go index 73183473..a4d5e043 100644 --- a/arrow/array/bufferbuilder.go +++ b/arrow/array/bufferbuilder.go @@ -243,6 +243,9 @@ func (b *multiBufferBuilder) UnsafeAppend(hdr *arrow.ViewHeader, val []byte) { hdr.SetIndexOffset(int32(idx), int32(offset)) n := copy(buf.Buf()[offset:], val) + if n != len(val) { + panic("arrow/array: multibufferbuilder could not append full value") + } buf.ResizeNoShrink(offset + n) } diff --git a/arrow/array/bufferbuilder_test.go b/arrow/array/bufferbuilder_test.go new file mode 100644 index 00000000..7acb5553 --- /dev/null +++ b/arrow/array/bufferbuilder_test.go @@ -0,0 +1,41 @@ +// Licensed to the Apache Software Foundation (ASF) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The ASF licenses this file +// to you under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in compliance +// with the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package array + +import ( + "testing" + + "github.com/apache/arrow-go/v18/arrow" + "github.com/apache/arrow-go/v18/arrow/memory" + "github.com/stretchr/testify/assert" +) + +func TestMultiBufferBuilderUnsafeAppendPanicsOnTruncatedCopy(t *testing.T) { + builder := multiBufferBuilder{mem: memory.NewGoAllocator(), blockSize: 8} + builder.Retain() + defer builder.Release() + + buf := memory.NewResizableBuffer(builder.mem) + buf.ResizeNoShrink(1) + builder.blocks = []*memory.Buffer{buf} + builder.currentOutBuffer = 0 + + var hdr arrow.ViewHeader + assert.Panics(t, func() { + builder.UnsafeAppend(&hdr, make([]byte, 64)) + }) +}