From aef39bc4b1e6b1389b99621c9ac2f402276814b6 Mon Sep 17 00:00:00 2001 From: David Carlier Date: Fri, 3 Dec 2021 21:06:15 +0000 Subject: [PATCH] mysqli: build fix with no mysqlnd option while using mariadb (fix #81658) --- ext/mysqli/mysqli.c | 8 +++++++- ext/mysqli/mysqli_api.c | 2 +- ext/mysqli/mysqli_nonapi.c | 2 +- ext/mysqli/tests/mysqli_constants.phpt | 3 ++- ext/pdo_mysql/mysql_driver.c | 4 ++-- 5 files changed, 13 insertions(+), 6 deletions(-) diff --git a/ext/mysqli/mysqli.c b/ext/mysqli/mysqli.c index f6694668ad768..b2c89aac0f3ae 100644 --- a/ext/mysqli/mysqli.c +++ b/ext/mysqli/mysqli.c @@ -596,7 +596,7 @@ PHP_MINIT_FUNCTION(mysqli) REGISTER_LONG_CONSTANT("MYSQLI_READ_DEFAULT_FILE", MYSQL_READ_DEFAULT_FILE, CONST_CS | CONST_PERSISTENT); REGISTER_LONG_CONSTANT("MYSQLI_OPT_CONNECT_TIMEOUT", MYSQL_OPT_CONNECT_TIMEOUT, CONST_CS | CONST_PERSISTENT); REGISTER_LONG_CONSTANT("MYSQLI_OPT_LOCAL_INFILE", MYSQL_OPT_LOCAL_INFILE, CONST_CS | CONST_PERSISTENT); -#if MYSQL_VERSION_ID >= 80021 || defined(MYSQLI_USE_MYSQLND) +#if (MYSQL_VERSION_ID >= 80021 && !defined(MARIADB_BASE_VERSION)) || defined(MYSQLI_USE_MYSQLND) REGISTER_LONG_CONSTANT("MYSQLI_OPT_LOAD_DATA_LOCAL_DIR", MYSQL_OPT_LOAD_DATA_LOCAL_DIR, CONST_CS | CONST_PERSISTENT); #endif REGISTER_LONG_CONSTANT("MYSQLI_INIT_COMMAND", MYSQL_INIT_COMMAND, CONST_CS | CONST_PERSISTENT); @@ -772,6 +772,12 @@ PHP_MINIT_FUNCTION(mysqli) REGISTER_LONG_CONSTANT("MYSQLI_TRANS_COR_RELEASE", TRANS_COR_RELEASE, CONST_CS | CONST_PERSISTENT); REGISTER_LONG_CONSTANT("MYSQLI_TRANS_COR_NO_RELEASE", TRANS_COR_NO_RELEASE, CONST_CS | CONST_PERSISTENT); +#ifdef MARIADB_BASE_VERSION + REGISTER_BOOL_CONSTANT("MYSQLI_IS_MARIADB", 1, CONST_CS | CONST_PERSISTENT); +#else + REGISTER_BOOL_CONSTANT("MYSQLI_IS_MARIADB", 0, CONST_CS | CONST_PERSISTENT); +#endif + #ifdef MYSQLI_USE_MYSQLND mysqlnd_reverse_api_register_api(&mysqli_reverse_api); diff --git a/ext/mysqli/mysqli_api.c b/ext/mysqli/mysqli_api.c index 96dee255b2b96..afd86bbe93a40 100644 --- a/ext/mysqli/mysqli_api.c +++ b/ext/mysqli/mysqli_api.c @@ -1720,7 +1720,7 @@ static int mysqli_options_get_option_zval_type(int option) #if MYSQL_VERSION_ID > 50605 || defined(MYSQLI_USE_MYSQLND) case MYSQL_SERVER_PUBLIC_KEY: #endif -#if MYSQL_VERSION_ID >= 80021 || defined(MYSQLI_USE_MYSQLND) +#if (MYSQL_VERSION_ID >= 80021 && !defined(MARIADB_BASE_VERSION)) || defined(MYSQLI_USE_MYSQLND) case MYSQL_OPT_LOAD_DATA_LOCAL_DIR: #endif return IS_STRING; diff --git a/ext/mysqli/mysqli_nonapi.c b/ext/mysqli/mysqli_nonapi.c index b905426eeae7e..3fe4408e29dd8 100644 --- a/ext/mysqli/mysqli_nonapi.c +++ b/ext/mysqli/mysqli_nonapi.c @@ -333,7 +333,7 @@ void mysqli_common_connect(INTERNAL_FUNCTION_PARAMETERS, bool is_real_connect, b unsigned int allow_local_infile = MyG(allow_local_infile); mysql_options(mysql->mysql, MYSQL_OPT_LOCAL_INFILE, (char *)&allow_local_infile); -#if MYSQL_VERSION_ID >= 80021 || defined(MYSQLI_USE_MYSQLND) +#if (MYSQL_VERSION_ID >= 80021 && !defined(MARIADB_BASE_VERSION)) || defined(MYSQLI_USE_MYSQLND) if (MyG(local_infile_directory) && !php_check_open_basedir(MyG(local_infile_directory))) { mysql_options(mysql->mysql, MYSQL_OPT_LOAD_DATA_LOCAL_DIR, MyG(local_infile_directory)); } diff --git a/ext/mysqli/tests/mysqli_constants.phpt b/ext/mysqli/tests/mysqli_constants.phpt index 4415f3250cc6d..0380792e06284 100644 --- a/ext/mysqli/tests/mysqli_constants.phpt +++ b/ext/mysqli/tests/mysqli_constants.phpt @@ -47,6 +47,7 @@ $expected_constants = array( "MYSQLI_GROUP_FLAG" => true, "MYSQLI_SERVER_QUERY_NO_GOOD_INDEX_USED"=> true, "MYSQLI_SERVER_QUERY_NO_INDEX_USED" => true, + "MYSQLI_IS_MARIADB" => true, "MYSQLI_TYPE_DECIMAL" => true, "MYSQLI_TYPE_TINY" => true, @@ -180,7 +181,7 @@ if ($IS_MYSQLND) { $expected_constants["MYSQLI_TYPE_JSON"] = true; } -if ($version > 80021 || $IS_MYSQLND) { +if (($version > 80021 && $constants['mysqli']['MYSQLI_IS_MARIADB']) || $IS_MYSQLND) { $expected_constants['MYSQLI_OPT_LOAD_DATA_LOCAL_DIR'] = true; } diff --git a/ext/pdo_mysql/mysql_driver.c b/ext/pdo_mysql/mysql_driver.c index 09083ccfc3057..c814324af9705 100644 --- a/ext/pdo_mysql/mysql_driver.c +++ b/ext/pdo_mysql/mysql_driver.c @@ -544,7 +544,7 @@ static int pdo_mysql_get_attribute(pdo_dbh_t *dbh, zend_long attr, zval *return_ ZVAL_BOOL(return_value, H->local_infile); break; -#if MYSQL_VERSION_ID >= 80021 || defined(PDO_USE_MYSQLND) +#if (MYSQL_VERSION_ID >= 80021 && !defined(MARIADB_BASE_VERSION)) || defined(PDO_USE_MYSQLND) case PDO_MYSQL_ATTR_LOCAL_INFILE_DIRECTORY: { const char* local_infile_directory = NULL; @@ -765,7 +765,7 @@ static int pdo_mysql_handle_factory(pdo_dbh_t *dbh, zval *driver_options) #endif } -#if MYSQL_VERSION_ID >= 80021 || defined(PDO_USE_MYSQLND) +#if (MYSQL_VERSION_ID >= 80021 && !defined(MARIADB_BASE_VERSION)) || defined(PDO_USE_MYSQLND) zend_string *local_infile_directory = pdo_attr_strval(driver_options, PDO_MYSQL_ATTR_LOCAL_INFILE_DIRECTORY, NULL); if (local_infile_directory && !php_check_open_basedir(ZSTR_VAL(local_infile_directory))) { if (mysql_options(H->server, MYSQL_OPT_LOAD_DATA_LOCAL_DIR, (const char *)ZSTR_VAL(local_infile_directory))) {