You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@arrow.apache.org by li...@apache.org on 2023/09/01 17:56:46 UTC

[arrow-adbc] branch main updated: fix(c/driver_manager): fix crash when error is null (#1029)

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

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


The following commit(s) were added to refs/heads/main by this push:
     new 1bc8a7fa fix(c/driver_manager): fix crash when error is null (#1029)
1bc8a7fa is described below

commit 1bc8a7faaab630e13c0d03bb3530acc1c7b37fc5
Author: David Li <li...@gmail.com>
AuthorDate: Fri Sep 1 13:56:41 2023 -0400

    fix(c/driver_manager): fix crash when error is null (#1029)
    
    Fixes #1028.
---
 c/driver_manager/adbc_driver_manager.cc      |  3 ++-
 c/driver_manager/adbc_driver_manager_test.cc | 15 +++++++++++++++
 go/adbc/drivermgr/adbc_driver_manager.cc     |  3 ++-
 3 files changed, 19 insertions(+), 2 deletions(-)

diff --git a/c/driver_manager/adbc_driver_manager.cc b/c/driver_manager/adbc_driver_manager.cc
index e4287534..c28bea93 100644
--- a/c/driver_manager/adbc_driver_manager.cc
+++ b/c/driver_manager/adbc_driver_manager.cc
@@ -651,7 +651,8 @@ const struct AdbcError* AdbcErrorFromArrayStream(struct ArrowArrayStream* stream
 }
 
 #define INIT_ERROR(ERROR, SOURCE)                                    \
-  if ((ERROR)->vendor_code == ADBC_ERROR_VENDOR_CODE_PRIVATE_DATA) { \
+  if ((ERROR) != nullptr &&                                          \
+      (ERROR)->vendor_code == ADBC_ERROR_VENDOR_CODE_PRIVATE_DATA) { \
     (ERROR)->private_driver = (SOURCE)->private_driver;              \
   }
 
diff --git a/c/driver_manager/adbc_driver_manager_test.cc b/c/driver_manager/adbc_driver_manager_test.cc
index 5e703903..58d056c4 100644
--- a/c/driver_manager/adbc_driver_manager_test.cc
+++ b/c/driver_manager/adbc_driver_manager_test.cc
@@ -33,6 +33,7 @@ std::string AdbcDriverManagerDefaultEntrypoint(const std::string& filename);
 
 namespace adbc {
 
+using adbc_validation::Handle;
 using adbc_validation::IsOkStatus;
 using adbc_validation::IsStatus;
 
@@ -227,6 +228,20 @@ class SqliteDatabaseTest : public ::testing::Test, public adbc_validation::Datab
 };
 ADBCV_TEST_DATABASE(SqliteDatabaseTest)
 
+TEST_F(SqliteDatabaseTest, NullError) {
+  Handle<AdbcConnection> conn;
+
+  ASSERT_THAT(AdbcDatabaseNew(&database, nullptr), IsOkStatus());
+  ASSERT_THAT(quirks()->SetupDatabase(&database, nullptr), IsOkStatus());
+  ASSERT_THAT(AdbcDatabaseInit(&database, nullptr), IsOkStatus());
+
+  ASSERT_THAT(AdbcConnectionNew(&conn.value, nullptr), IsOkStatus());
+  ASSERT_THAT(AdbcConnectionInit(&conn.value, &database, nullptr), IsOkStatus());
+  ASSERT_THAT(AdbcConnectionRelease(&conn.value, nullptr), IsOkStatus());
+
+  ASSERT_THAT(AdbcDatabaseRelease(&database, nullptr), IsOkStatus());
+}
+
 class SqliteConnectionTest : public ::testing::Test,
                              public adbc_validation::ConnectionTest {
  public:
diff --git a/go/adbc/drivermgr/adbc_driver_manager.cc b/go/adbc/drivermgr/adbc_driver_manager.cc
index e4287534..c28bea93 100644
--- a/go/adbc/drivermgr/adbc_driver_manager.cc
+++ b/go/adbc/drivermgr/adbc_driver_manager.cc
@@ -651,7 +651,8 @@ const struct AdbcError* AdbcErrorFromArrayStream(struct ArrowArrayStream* stream
 }
 
 #define INIT_ERROR(ERROR, SOURCE)                                    \
-  if ((ERROR)->vendor_code == ADBC_ERROR_VENDOR_CODE_PRIVATE_DATA) { \
+  if ((ERROR) != nullptr &&                                          \
+      (ERROR)->vendor_code == ADBC_ERROR_VENDOR_CODE_PRIVATE_DATA) { \
     (ERROR)->private_driver = (SOURCE)->private_driver;              \
   }