From 12a70541944bf21bfbb9a07d3a1af0345d12b3b6 Mon Sep 17 00:00:00 2001 From: Georg Richter Date: Sun, 22 Dec 2024 11:00:12 +0100 Subject: [PATCH] Partial revert of 1a2ed3f67af698b394b2faed069b49d4f409a155 Since Item_result enumerations are also used by MariaDB server, we moved them back to mariadb_com.h. Item_result is not used in Connector/C 3.3 and above for replication api. --- CMakeLists.txt | 14 +++++++++++++ include/mariadb_com.h | 2 ++ libmariadb/mariadb_lib.c | 43 ++++++++++++++++++++++++++++++++-------- 3 files changed, 51 insertions(+), 8 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 31fcea9d..c3602e2e 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -68,6 +68,20 @@ ADD_OPTION(WITH_CURL "Enables use of curl" ON) ADD_OPTION(WITH_SSL "Enables use of TLS/SSL library" ON) ############### +if (WITH_ASAN) + set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -O0 -g -static-libasan") + set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fno-sanitize-recover=all") + set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fno-omit-frame-pointer") + set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fno-common") + set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fsanitize=address") + set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fsanitize-address-use-after-scope") + set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fsanitize=undefined") + set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fno-sanitize=alignment") + set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fno-sanitize=null") + set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fno-sanitize=vptr") + set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -static-libasan") +endif() + INCLUDE(${CC_SOURCE_DIR}/cmake/misc.cmake) INCLUDE(FindCURL) diff --git a/include/mariadb_com.h b/include/mariadb_com.h index 57e48925..195979af 100644 --- a/include/mariadb_com.h +++ b/include/mariadb_com.h @@ -59,6 +59,8 @@ enum mysql_enum_shutdown_level KILL_CONNECTION= 255 }; +enum Item_result {STRING_RESULT,REAL_RESULT,INT_RESULT,ROW_RESULT,DECIMAL_RESULT}; + enum enum_server_command { COM_SLEEP = 0, diff --git a/libmariadb/mariadb_lib.c b/libmariadb/mariadb_lib.c index ebe03a8d..0ce71dfc 100644 --- a/libmariadb/mariadb_lib.c +++ b/libmariadb/mariadb_lib.c @@ -879,6 +879,35 @@ static size_t rset_field_offsets[]= { OFFSET(MYSQL_FIELD, org_name_length) }; +/* calculate lengths for field metadata: + returns zero on success, 1 if null_length was + detected */ +static my_bool ma_get_rset_field_lengths(MYSQL_ROW row, unsigned int field_count, + unsigned long *lengths) +{ + unsigned long *last_length= 0; + char *pos= 0; + MYSQL_ROW end= row + field_count + 1; + my_bool rc= 0; + + while (row != end) + { + if (*row) + { + if (pos) + *last_length= (ulong)(*row - pos - 1); + pos= *row; + } else { + /* NULL_LENGTH (see also CONC-709) */ + rc= 1; + *last_length= 0; + } + last_length= lengths++; + row++; + } + return rc; +} + MYSQL_FIELD * unpack_fields(const MYSQL *mysql, MYSQL_DATA *data, MA_MEM_ROOT *alloc, uint fields, @@ -895,21 +924,19 @@ unpack_fields(const MYSQL *mysql, for (row=data->data; row ; row = row->next,field++) { + unsigned long lengths[9]; + if (field >= result + fields) goto error; + if (ma_get_rset_field_lengths(row->data, field_count, lengths)) + goto error; + for (i=0; i < field_count; i++) { - uint length; - - if (!row->data[i]) - goto error; - - length= (uint)(row->data[i+1] - row->data[i] - 1); - *(char **)(((char *)field) + rset_field_offsets[i*2])= ma_strdup_root(alloc, (char *)row->data[i]); - *(unsigned int *)(((char *)field) + rset_field_offsets[i*2+1])= length; + *(unsigned int *)(((char *)field) + rset_field_offsets[i*2+1])= lengths[i]; } field->extension= NULL;