Skip to content

Commit

Permalink
Fix #81658: MYSQL_OPT_LOAD_DATA_LOCAL_DIR not available in MariaDB
Browse files Browse the repository at this point in the history
This also introduces the boolean userland constant `MYSQLI_IS_MARIADB`.
  • Loading branch information
devnexen authored and cmb69 committed Dec 5, 2021
1 parent dab6226 commit 15e7e57
Show file tree
Hide file tree
Showing 6 changed files with 18 additions and 6 deletions.
5 changes: 5 additions & 0 deletions NEWS
Expand Up @@ -10,6 +10,11 @@ PHP NEWS
- MBString:
. Fixed bug #81693 (mb_check_encoding(7bit) segfaults). (cmb)

- MySQLi:
. Fixed bug #81658 (MYSQL_OPT_LOAD_DATA_LOCAL_DIR not available in MariaDB).
(devnexen)
. Introduced MYSQLI_IS_MARIADB. (devnexen)

- Reflection:
. Fixed bug #81681 (ReflectionEnum throwing exceptions). (cmb)

Expand Down
8 changes: 7 additions & 1 deletion ext/mysqli/mysqli.c
Expand Up @@ -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);
Expand Down Expand Up @@ -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);
Expand Down
2 changes: 1 addition & 1 deletion ext/mysqli/mysqli_api.c
Expand Up @@ -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;
Expand Down
2 changes: 1 addition & 1 deletion ext/mysqli/mysqli_nonapi.c
Expand Up @@ -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));
}
Expand Down
3 changes: 2 additions & 1 deletion ext/mysqli/tests/mysqli_constants.phpt
Expand Up @@ -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,
Expand Down Expand Up @@ -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;
}

Expand Down
4 changes: 2 additions & 2 deletions ext/pdo_mysql/mysql_driver.c
Expand Up @@ -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;
Expand Down Expand Up @@ -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))) {
Expand Down

0 comments on commit 15e7e57

Please sign in to comment.