Skip to content

Commit a5a0ff6

Browse files
arshidkv12iluuu1994kamil-tekielaGirgias
authored
ext/mysqli: raise ValueError for invalid option in mysqli_options() (#20971)
Closes GH-20968 Co-authored-by: Ilija Tovilo <ilija.tovilo@me.com> Co-authored-by: Kamil Tekiela <tekiela246@gmail.com> Co-authored-by: Gina Peter Banyard <girgias@php.net>
1 parent f0f28b7 commit a5a0ff6

4 files changed

Lines changed: 46 additions & 7 deletions

File tree

ext/mysqli/mysqli_api.c

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1198,6 +1198,11 @@ PHP_FUNCTION(mysqli_options)
11981198
MYSQLI_FETCH_RESOURCE_CONN(mysql, mysql_link, MYSQLI_STATUS_INITIALIZED);
11991199

12001200
expected_type = mysqli_options_get_option_zval_type(mysql_option);
1201+
if (expected_type == IS_NULL) {
1202+
zend_argument_value_error(ERROR_ARG_POS(2), "must be MYSQLI_INIT_COMMAND, MYSQLI_SET_CHARSET_NAME, MYSQLI_SERVER_PUBLIC_KEY, or one of the MYSQLI_OPT_* constants");
1203+
RETURN_THROWS();
1204+
}
1205+
12011206
if (expected_type != Z_TYPE_P(mysql_value)) {
12021207
switch (expected_type) {
12031208
case IS_STRING:

ext/mysqli/tests/gh20968.phpt

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
--TEST--
2+
GH-20968 mysqli_options() with invalid option should triggers ValueError
3+
--EXTENSIONS--
4+
mysqli
5+
--CONFLICTS--
6+
mysqli
7+
--SKIPIF--
8+
<?php
9+
require_once 'skipifconnectfailure.inc';
10+
?>
11+
--FILE--
12+
<?php
13+
require_once 'connect.inc';
14+
15+
$mysqli = new mysqli($host, $user, $passwd, $db, $port, $socket);
16+
17+
try {
18+
$value = $mysqli->options(10, 'invalid_option');
19+
var_dump($value);
20+
} catch (ValueError $exception) {
21+
echo $exception->getMessage() . "\n";
22+
}
23+
24+
?>
25+
--EXPECTF--
26+
mysqli::options(): Argument #%d ($option) must be MYSQLI_INIT_COMMAND, MYSQLI_SET_CHARSET_NAME, MYSQLI_SERVER_PUBLIC_KEY, or one of the MYSQLI_OPT_* constants

ext/mysqli/tests/mysqli_options.phpt

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,13 @@ var_dump("MYSQLI_OPT_LOCAL_INFILE", mysqli_options($link, MYSQLI_OPT_LOCAL_INFIL
6060
var_dump("MYSQLI_INIT_COMMAND", mysqli_options($link, MYSQLI_INIT_COMMAND, 'SET AUTOCOMMIT=0'));
6161

6262
/* mysqli_real_connect() */
63-
var_dump("MYSQLI_CLIENT_SSL", mysqli_options($link, MYSQLI_CLIENT_SSL, 'not a mysqli_option'));
63+
var_dump("MYSQLI_CLIENT_SSL");
64+
65+
try {
66+
var_dump(mysqli_options($link, MYSQLI_CLIENT_SSL, 'not a mysqli_option'));
67+
} catch (ValueError $exception) {
68+
echo $exception->getMessage() . "\n";
69+
}
6470

6571
mysqli_close($link);
6672

@@ -81,9 +87,6 @@ try {
8187
echo $e->getMessage() . "\n";
8288
}
8389

84-
// invalid options do not generate errors
85-
mysqli_options($link, -1, "Invalid option");
86-
8790
print "done!";
8891
?>
8992
--EXPECTF--
@@ -110,7 +113,7 @@ bool(true)
110113
%s(19) "MYSQLI_INIT_COMMAND"
111114
bool(true)
112115
%s(17) "MYSQLI_CLIENT_SSL"
113-
bool(false)
116+
mysqli_options(): Argument #%d ($option) must be MYSQLI_INIT_COMMAND, MYSQLI_SET_CHARSET_NAME, MYSQLI_SERVER_PUBLIC_KEY, or one of the MYSQLI_OPT_* constants
114117
Link closed
115118
mysqli object is already closed
116119
Unknown character set

ext/mysqli/tests/mysqli_set_opt.phpt

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,12 @@ require_once 'skipifconnectfailure.inc';
2424
var_dump(mysqli_set_opt($link, MYSQLI_OPT_CONNECT_TIMEOUT, 10));
2525
var_dump(mysqli_set_opt($link, MYSQLI_OPT_LOCAL_INFILE, 1));
2626
var_dump(mysqli_set_opt($link, MYSQLI_INIT_COMMAND, 'SET AUTOCOMMIT=0'));
27-
var_dump(mysqli_set_opt($link, MYSQLI_CLIENT_SSL, 'not an mysqli_option'));
27+
28+
try {
29+
var_dump(mysqli_set_opt($link, MYSQLI_CLIENT_SSL, 'not an mysqli_option'));
30+
} catch (ValueError $exception) {
31+
echo $exception->getMessage() . "\n";
32+
}
2833

2934
mysqli_close($link);
3035

@@ -48,6 +53,6 @@ bool(true)
4853
bool(true)
4954
bool(true)
5055
bool(true)
51-
bool(false)
56+
mysqli_set_opt(): Argument #2 ($option) must be MYSQLI_INIT_COMMAND, MYSQLI_SET_CHARSET_NAME, MYSQLI_SERVER_PUBLIC_KEY, or one of the MYSQLI_OPT_* constants
5257
mysqli object is already closed
5358
done!

0 commit comments

Comments
 (0)