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/06/14 11:44:42 UTC

[arrow-adbc] branch main updated: fix(c/driver/common): Prevent UB in GetObjects with NULL argument (#786)

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 073ce302 fix(c/driver/common): Prevent UB in GetObjects with NULL argument (#786)
073ce302 is described below

commit 073ce3026027cbdf8a423f437a16f6148c76ac93
Author: William Ayd <wi...@icloud.com>
AuthorDate: Wed Jun 14 04:44:35 2023 -0700

    fix(c/driver/common): Prevent UB in GetObjects with NULL argument (#786)
---
 c/driver/common/utils.c | 92 +++++++++++++++++++++++++------------------------
 1 file changed, 47 insertions(+), 45 deletions(-)

diff --git a/c/driver/common/utils.c b/c/driver/common/utils.c
index e2060737..dbfe9613 100644
--- a/c/driver/common/utils.c
+++ b/c/driver/common/utils.c
@@ -812,11 +812,13 @@ void AdbcGetObjectsDataDelete(struct AdbcGetObjectsData* get_objects_data) {
 
 struct AdbcGetObjectsCatalog* AdbcGetObjectsDataGetCatalogByName(
     struct AdbcGetObjectsData* get_objects_data, const char* const catalog_name) {
-  for (int64_t i = 0; i < get_objects_data->n_catalogs; i++) {
-    struct AdbcGetObjectsCatalog* catalog = get_objects_data->catalogs[i];
-    struct ArrowStringView name = catalog->catalog_name;
-    if (!strncmp(name.data, catalog_name, name.size_bytes)) {
-      return catalog;
+  if (catalog_name != NULL) {
+    for (int64_t i = 0; i < get_objects_data->n_catalogs; i++) {
+      struct AdbcGetObjectsCatalog* catalog = get_objects_data->catalogs[i];
+      struct ArrowStringView name = catalog->catalog_name;
+      if (!strncmp(name.data, catalog_name, name.size_bytes)) {
+        return catalog;
+      }
     }
   }
 
@@ -826,16 +828,16 @@ struct AdbcGetObjectsCatalog* AdbcGetObjectsDataGetCatalogByName(
 struct AdbcGetObjectsSchema* AdbcGetObjectsDataGetSchemaByName(
     struct AdbcGetObjectsData* get_objects_data, const char* const catalog_name,
     const char* const schema_name) {
-  struct AdbcGetObjectsCatalog* catalog =
-      AdbcGetObjectsDataGetCatalogByName(get_objects_data, catalog_name);
-  if (catalog == NULL) {
-    return NULL;
-  } else {
-    for (int64_t i = 0; i < catalog->n_db_schemas; i++) {
-      struct AdbcGetObjectsSchema* schema = catalog->catalog_db_schemas[i];
-      struct ArrowStringView name = schema->db_schema_name;
-      if (!strncmp(name.data, schema_name, name.size_bytes)) {
-        return schema;
+  if (schema_name != NULL) {
+    struct AdbcGetObjectsCatalog* catalog =
+        AdbcGetObjectsDataGetCatalogByName(get_objects_data, catalog_name);
+    if (catalog != NULL) {
+      for (int64_t i = 0; i < catalog->n_db_schemas; i++) {
+        struct AdbcGetObjectsSchema* schema = catalog->catalog_db_schemas[i];
+        struct ArrowStringView name = schema->db_schema_name;
+        if (!strncmp(name.data, schema_name, name.size_bytes)) {
+          return schema;
+        }
       }
     }
   }
@@ -846,16 +848,16 @@ struct AdbcGetObjectsSchema* AdbcGetObjectsDataGetSchemaByName(
 struct AdbcGetObjectsTable* AdbcGetObjectsDataGetTableByName(
     struct AdbcGetObjectsData* get_objects_data, const char* const catalog_name,
     const char* const schema_name, const char* const table_name) {
-  struct AdbcGetObjectsSchema* schema =
-      AdbcGetObjectsDataGetSchemaByName(get_objects_data, catalog_name, schema_name);
-  if (schema == NULL) {
-    return NULL;
-  } else {
-    for (int64_t i = 0; i < schema->n_db_schema_tables; i++) {
-      struct AdbcGetObjectsTable* table = schema->db_schema_tables[i];
-      struct ArrowStringView name = table->table_name;
-      if (!strncmp(name.data, table_name, name.size_bytes)) {
-        return table;
+  if (table_name != NULL) {
+    struct AdbcGetObjectsSchema* schema =
+        AdbcGetObjectsDataGetSchemaByName(get_objects_data, catalog_name, schema_name);
+    if (schema != NULL) {
+      for (int64_t i = 0; i < schema->n_db_schema_tables; i++) {
+        struct AdbcGetObjectsTable* table = schema->db_schema_tables[i];
+        struct ArrowStringView name = table->table_name;
+        if (!strncmp(name.data, table_name, name.size_bytes)) {
+          return table;
+        }
       }
     }
   }
@@ -867,16 +869,16 @@ struct AdbcGetObjectsColumn* AdbcGetObjectsDataGetColumnByName(
     struct AdbcGetObjectsData* get_objects_data, const char* const catalog_name,
     const char* const schema_name, const char* const table_name,
     const char* const column_name) {
-  struct AdbcGetObjectsTable* table = AdbcGetObjectsDataGetTableByName(
-      get_objects_data, catalog_name, schema_name, table_name);
-  if (table == NULL) {
-    return NULL;
-  } else {
-    for (int64_t i = 0; i < table->n_table_columns; i++) {
-      struct AdbcGetObjectsColumn* column = table->table_columns[i];
-      struct ArrowStringView name = column->column_name;
-      if (!strncmp(name.data, column_name, name.size_bytes)) {
-        return column;
+  if (column_name != NULL) {
+    struct AdbcGetObjectsTable* table = AdbcGetObjectsDataGetTableByName(
+        get_objects_data, catalog_name, schema_name, table_name);
+    if (table != NULL) {
+      for (int64_t i = 0; i < table->n_table_columns; i++) {
+        struct AdbcGetObjectsColumn* column = table->table_columns[i];
+        struct ArrowStringView name = column->column_name;
+        if (!strncmp(name.data, column_name, name.size_bytes)) {
+          return column;
+        }
       }
     }
   }
@@ -888,16 +890,16 @@ struct AdbcGetObjectsConstraint* AdbcGetObjectsDataGetConstraintByName(
     struct AdbcGetObjectsData* get_objects_data, const char* const catalog_name,
     const char* const schema_name, const char* const table_name,
     const char* const constraint_name) {
-  struct AdbcGetObjectsTable* table = AdbcGetObjectsDataGetTableByName(
-      get_objects_data, catalog_name, schema_name, table_name);
-  if (table == NULL) {
-    return NULL;
-  } else {
-    for (int64_t i = 0; i < table->n_table_constraints; i++) {
-      struct AdbcGetObjectsConstraint* constraint = table->table_constraints[i];
-      struct ArrowStringView name = constraint->constraint_name;
-      if (!strncmp(name.data, constraint_name, name.size_bytes)) {
-        return constraint;
+  if (constraint_name != NULL) {
+    struct AdbcGetObjectsTable* table = AdbcGetObjectsDataGetTableByName(
+        get_objects_data, catalog_name, schema_name, table_name);
+    if (table != NULL) {
+      for (int64_t i = 0; i < table->n_table_constraints; i++) {
+        struct AdbcGetObjectsConstraint* constraint = table->table_constraints[i];
+        struct ArrowStringView name = constraint->constraint_name;
+        if (!strncmp(name.data, constraint_name, name.size_bytes)) {
+          return constraint;
+        }
       }
     }
   }