From bf42dc64a98559b0d6602dd709dc18d05db9764f Mon Sep 17 00:00:00 2001 From: David Li Date: Mon, 4 Mar 2024 14:21:39 -0500 Subject: [PATCH] fix(go/adbc/drivermgr): don't call potentially nil pointer (#1586) Fixes #1476. --- go/adbc/drivermgr/wrapper.go | 15 +++++++++++++-- go/adbc/drivermgr/wrapper_sqlite_test.go | 4 ++-- 2 files changed, 15 insertions(+), 4 deletions(-) diff --git a/go/adbc/drivermgr/wrapper.go b/go/adbc/drivermgr/wrapper.go index e195af089c..09398c9481 100644 --- a/go/adbc/drivermgr/wrapper.go +++ b/go/adbc/drivermgr/wrapper.go @@ -27,7 +27,12 @@ package drivermgr // #include "adbc.h" // #include // -// void releaseErr(struct AdbcError* err) { err->release(err); } +// void releaseErr(struct AdbcError* err) { +// if (err->release != NULL) { +// err->release(err); +// err->release = NULL; +// } +// } // struct ArrowArray* allocArr() { // return (struct ArrowArray*)malloc(sizeof(struct ArrowArray)); // } @@ -112,7 +117,13 @@ type Database struct { } func toAdbcError(code adbc.Status, e *C.struct_AdbcError) error { - err := &adbc.Error{ + if e == nil || e.release == nil { + return adbc.Error{ + Code: code, + Msg: "[drivermgr] nil error", + } + } + err := adbc.Error{ Code: code, VendorCode: int32(e.vendor_code), Msg: C.GoString(e.message), diff --git a/go/adbc/drivermgr/wrapper_sqlite_test.go b/go/adbc/drivermgr/wrapper_sqlite_test.go index 94fca3113e..6ca13e9996 100644 --- a/go/adbc/drivermgr/wrapper_sqlite_test.go +++ b/go/adbc/drivermgr/wrapper_sqlite_test.go @@ -453,7 +453,7 @@ func (dm *DriverMgrSuite) TestSqlExecuteInvalid() { _, _, err = st.ExecuteQuery(dm.ctx) dm.Require().Error(err) - var adbcErr *adbc.Error + var adbcErr adbc.Error dm.ErrorAs(err, &adbcErr) dm.ErrorContains(adbcErr, "[SQLite] Failed to prepare query:") dm.ErrorContains(adbcErr, "syntax error") @@ -610,7 +610,7 @@ func TestDriverMgrCustomInitFunc(t *testing.T) { "entrypoint": "ThisSymbolDoesNotExist", }) assert.Nil(t, db) - var exp *adbc.Error + var exp adbc.Error assert.ErrorAs(t, err, &exp) assert.Equal(t, adbc.StatusInternal, exp.Code) if runtime.GOOS == "windows" {