You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@arrow.apache.org by ze...@apache.org on 2025/08/05 18:02:58 UTC

(arrow-go) branch main updated: fix(array): add nil checks in Data.Release() for childData (#456)

This is an automated email from the ASF dual-hosted git repository.

zeroshade pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/arrow-go.git


The following commit(s) were added to refs/heads/main by this push:
     new 4c2983c  fix(array): add nil checks in Data.Release() for childData (#456)
4c2983c is described below

commit 4c2983c9e14ce4fb7ee9fc135815426b8f8c880f
Author: secfree <se...@gmail.com>
AuthorDate: Wed Aug 6 02:02:49 2025 +0800

    fix(array): add nil checks in Data.Release() for childData (#456)
    
    ### Rationale for this change
    
    My program crashed with below log
    
    ```
    panic: runtime error: invalid memory address or nil pointer dereference
    [signal SIGSEGV: segmentation violation code=0x1 addr=0x0 pc=0x53beb92]
    
    goroutine 294 [running]:
    github.com/apache/arrow-go/v18/arrow/array.(*Data).Release(0xc02586a5b0)
            /root/go/pkg/mod/github.com/apache/arrow-go/v18@v18.4.0/arrow/array/data.go:150 +0x172
    github.com/apache/arrow-go/v18/arrow/array.concat.func1()
            /root/go/pkg/mod/github.com/apache/arrow-go/v18@v18.4.0/arrow/array/concat.go:528 +0x9c
    github.com/apache/arrow-go/v18/arrow/array.concat({0xc14ae66008, 0x100, 0x100}, {0x83213c0, 0xb026080})
            /root/go/pkg/mod/github.com/apache/arrow-go/v18@v18.4.0/arrow/array/concat.go:652 +0x3f7d
    github.com/apache/arrow-go/v18/arrow/array.Concatenate({0xc104861908, 0x100, 0x12f}, {0x83213c0, 0xb026080})
            /root/go/pkg/mod/github.com/apache/arrow-go/v18@v18.4.0/arrow/array/concat.go:55 +0x585
    ...
    ```
    
    ### What changes are included in this PR?
    
    Add nil check in Data.Release() for childData to avoid crash.
    
    ### Are these changes tested?
    
    Yes.
    
    ### Are there any user-facing changes?
    
    No.
---
 arrow/array/data.go      |  4 +++-
 arrow/array/data_test.go | 19 +++++++++++++++++++
 2 files changed, 22 insertions(+), 1 deletion(-)

diff --git a/arrow/array/data.go b/arrow/array/data.go
index 62284b3..6dafd8a 100644
--- a/arrow/array/data.go
+++ b/arrow/array/data.go
@@ -147,7 +147,9 @@ func (d *Data) Release() {
 		}
 
 		for _, b := range d.childData {
-			b.Release()
+			if b != nil {
+				b.Release()
+			}
 		}
 
 		if d.dictionary != nil {
diff --git a/arrow/array/data_test.go b/arrow/array/data_test.go
index adc91a8..0a08c78 100644
--- a/arrow/array/data_test.go
+++ b/arrow/array/data_test.go
@@ -136,3 +136,22 @@ func TestSizeInBytes(t *testing.T) {
 		}
 	})
 }
+
+func TestDataReleaseWithNilChildData(t *testing.T) {
+	mem := memory.NewCheckedAllocator(memory.DefaultAllocator)
+	defer mem.AssertSize(t, 0)
+
+	// Create a Data object that simulates the state after a failed concatenation
+	// where childData slice is allocated but contains nil elements
+	buffers := []*memory.Buffer{memory.NewBufferBytes([]byte("test-buffer"))}
+	data := NewData(arrow.ListOf(arrow.PrimitiveTypes.Int32), 1, buffers, nil, 0, 0)
+
+	// Simulate the scenario where childData is allocated but elements remain nil
+	// This happens in concat.go when childData is allocated but concat() fails
+	data.childData = make([]arrow.ArrayData, 1)
+	// data.childData[0] remains nil (simulating failed concat)
+
+	assert.NotPanics(t, func() {
+		data.Release()
+	}, "Release() should not panic when childData contains nil elements")
+}