Skip to content

Commit 2744a04

Browse files
committed
Add zend_string INI validators
Currently we only have validators for char* which is rather annoying as INI settings are saved as zend_string* in the first place
1 parent 742b4ba commit 2744a04

File tree

8 files changed

+85
-1
lines changed

8 files changed

+85
-1
lines changed

Zend/zend_ini.c

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -876,3 +876,23 @@ ZEND_API ZEND_INI_MH(OnUpdateStringUnempty) /* {{{ */
876876
return SUCCESS;
877877
}
878878
/* }}} */
879+
880+
ZEND_API ZEND_INI_MH(OnUpdateStr) /* {{{ */
881+
{
882+
zend_string **p = (zend_string **) ZEND_INI_GET_ADDR();
883+
*p = new_value ? new_value : NULL;
884+
return SUCCESS;
885+
}
886+
/* }}} */
887+
888+
ZEND_API ZEND_INI_MH(OnUpdateStrNotEmpty) /* {{{ */
889+
{
890+
if (new_value && ZSTR_LEN(new_value) == 0) {
891+
return FAILURE;
892+
}
893+
894+
zend_string **p = (zend_string **) ZEND_INI_GET_ADDR();
895+
*p = new_value ? new_value : NULL;
896+
return SUCCESS;
897+
}
898+
/* }}} */

Zend/zend_ini.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -209,8 +209,12 @@ ZEND_API ZEND_INI_MH(OnUpdateBool);
209209
ZEND_API ZEND_INI_MH(OnUpdateLong);
210210
ZEND_API ZEND_INI_MH(OnUpdateLongGEZero);
211211
ZEND_API ZEND_INI_MH(OnUpdateReal);
212+
/* char* versions */
212213
ZEND_API ZEND_INI_MH(OnUpdateString);
213214
ZEND_API ZEND_INI_MH(OnUpdateStringUnempty);
215+
/* zend_string* versions */
216+
ZEND_API ZEND_INI_MH(OnUpdateStr);
217+
ZEND_API ZEND_INI_MH(OnUpdateStrNotEmpty);
214218
END_EXTERN_C()
215219

216220
#define ZEND_INI_DISPLAY_ORIG 1

ext/zend_test/php_test.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,8 @@ ZEND_BEGIN_MODULE_GLOBALS(zend_test)
5454
bool print_stderr_mshutdown;
5555
zend_test_fiber *active_fiber;
5656
zend_long quantity_value;
57+
zend_string *str_test;
58+
zend_string *not_empty_str_test;
5759
ZEND_END_MODULE_GLOBALS(zend_test)
5860

5961
extern ZEND_DECLARE_MODULE_GLOBALS(zend_test)

ext/zend_test/test.c

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -415,6 +415,13 @@ static ZEND_FUNCTION(zend_test_zend_ini_parse_uquantity)
415415
}
416416
}
417417

418+
static ZEND_FUNCTION(zend_test_zend_ini_str)
419+
{
420+
ZEND_PARSE_PARAMETERS_NONE();
421+
422+
RETURN_STR(ZT_G(str_test));
423+
}
424+
418425
static ZEND_FUNCTION(namespaced_func)
419426
{
420427
ZEND_PARSE_PARAMETERS_NONE();
@@ -616,6 +623,8 @@ PHP_INI_BEGIN()
616623
STD_PHP_INI_BOOLEAN("zend_test.register_passes", "0", PHP_INI_SYSTEM, OnUpdateBool, register_passes, zend_zend_test_globals, zend_test_globals)
617624
STD_PHP_INI_BOOLEAN("zend_test.print_stderr_mshutdown", "0", PHP_INI_SYSTEM, OnUpdateBool, print_stderr_mshutdown, zend_zend_test_globals, zend_test_globals)
618625
STD_PHP_INI_ENTRY("zend_test.quantity_value", "0", PHP_INI_ALL, OnUpdateLong, quantity_value, zend_zend_test_globals, zend_test_globals)
626+
STD_PHP_INI_ENTRY("zend_test.str_test", "", PHP_INI_ALL, OnUpdateStr, str_test, zend_zend_test_globals, zend_test_globals)
627+
STD_PHP_INI_ENTRY("zend_test.not_empty_str_test", "val", PHP_INI_ALL, OnUpdateStrNotEmpty, not_empty_str_test, zend_zend_test_globals, zend_test_globals)
619628
PHP_INI_END()
620629

621630
void (*old_zend_execute_ex)(zend_execute_data *execute_data);

ext/zend_test/test.stub.php

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -143,6 +143,8 @@ function zend_call_method(object|string $obj_or_class, string $method, mixed $ar
143143

144144
function zend_test_zend_ini_parse_quantity(string $str): int {}
145145
function zend_test_zend_ini_parse_uquantity(string $str): int {}
146+
147+
function zend_test_zend_ini_str(): string {}
146148
}
147149

148150
namespace ZendTestNS {

ext/zend_test/test_arginfo.h

Lines changed: 5 additions & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
--TEST--
2+
Test OnUpdateStr and OnUpdateStrNotEmpty validators.
3+
--EXTENSIONS--
4+
zend_test
5+
--FILE--
6+
<?php
7+
echo 'str_test INI', PHP_EOL;
8+
var_dump(ini_get("zend_test.str_test"));
9+
var_dump(ini_set("zend_test.str_test", "Test"));
10+
var_dump(ini_get("zend_test.str_test"));
11+
var_dump(ini_set("zend_test.str_test", ""));
12+
var_dump(ini_get("zend_test.str_test"));
13+
14+
echo 'not_empty_str_test INI', PHP_EOL;
15+
var_dump(ini_get("zend_test.not_empty_str_test"));
16+
var_dump(ini_set("zend_test.not_empty_str_test", "Test"));
17+
var_dump(ini_get("zend_test.not_empty_str_test"));
18+
var_dump(ini_set("zend_test.not_empty_str_test", ""));
19+
var_dump(ini_get("zend_test.not_empty_str_test"));
20+
?>
21+
--EXPECT--
22+
str_test INI
23+
string(0) ""
24+
string(0) ""
25+
string(4) "Test"
26+
string(4) "Test"
27+
string(0) ""
28+
not_empty_str_test INI
29+
string(3) "val"
30+
string(3) "val"
31+
string(4) "Test"
32+
bool(false)
33+
string(4) "Test"
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
--TEST--
2+
Test zend_test_zend_ini_str() to check for GC refcount on global returned
3+
--EXTENSIONS--
4+
zend_test
5+
--FILE--
6+
<?php
7+
var_dump(zend_test_zend_ini_str());
8+
?>
9+
--EXPECT--
10+
string(0) ""

0 commit comments

Comments
 (0)