Skip to content

Commit 8627c43

Browse files
committed
Merge branch '479'
* 479: Expose internal key check via checkKey() method Make ascii key check consistent with libmemcached's isgraph() check Add test to check that they match Fix stubs to make them consistent for PHP 8
2 parents 0c3f411 + 7be9f00 commit 8627c43

File tree

6 files changed

+173
-9
lines changed

6 files changed

+173
-9
lines changed

package.xml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -87,6 +87,7 @@ Fixes
8787
<file role='test' name='cas_multi.phpt'/>
8888
<file role='test' name='check_if_persistent.phpt'/>
8989
<file role='test' name='check_if_pristine.phpt'/>
90+
<file role='test' name='check_key.phpt'/>
9091
<file role='test' name='clone.phpt'/>
9192
<file role='test' name='compression_conditions.phpt'/>
9293
<file role='test' name='compression_types.phpt'/>

php_memcached.c

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -228,7 +228,7 @@ zend_bool s_memc_valid_key_ascii(zend_string *key)
228228
size_t i, len = ZSTR_LEN(key);
229229

230230
for (i = 0; i < len; i++) {
231-
if (iscntrl(str[i]) || isspace(str[i]))
231+
if (!isgraph(str[i]) || isspace(str[i]))
232232
return 0;
233233
}
234234
return 1;
@@ -3450,6 +3450,24 @@ static PHP_METHOD(Memcached, isPristine)
34503450
}
34513451
/* }}} */
34523452

3453+
/* {{{ bool Memcached::checkKey(string key)
3454+
Checks if a key is valid */
3455+
PHP_METHOD(Memcached, checkKey)
3456+
{
3457+
zend_string *key;
3458+
MEMC_METHOD_INIT_VARS;
3459+
3460+
ZEND_PARSE_PARAMETERS_START(1, 1)
3461+
Z_PARAM_STR(key)
3462+
ZEND_PARSE_PARAMETERS_END();
3463+
3464+
MEMC_METHOD_FETCH_OBJECT;
3465+
s_memc_set_status(intern, MEMCACHED_SUCCESS, 0);
3466+
MEMC_CHECK_KEY(intern, key);
3467+
RETURN_TRUE;
3468+
}
3469+
/* }}} */
3470+
34533471
/****************************************
34543472
Internal support code
34553473
****************************************/

php_memcached.stub.php

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -8,17 +8,17 @@
88

99
class Memcached {
1010

11-
public function __construct(string $persistent_id=null, callable $callback=null, string $connection_str=null) {}
11+
public function __construct(?string $persistent_id=null, ?callable $callback=null, ?string $connection_str=null) {}
1212

1313
public function getResultCode(): int {}
1414
public function getResultMessage(): string {}
1515

16-
public function get(string $key, callable $cache_cb=null, int $get_flags=0): mixed {}
17-
public function getByKey(string $server_key, string $key, callable $cache_cb=null, int $get_flags=0): mixed {}
16+
public function get(string $key, ?callable $cache_cb=null, int $get_flags=0): mixed {}
17+
public function getByKey(string $server_key, string $key, ?callable $cache_cb=null, int $get_flags=0): mixed {}
1818
public function getMulti(array $keys, int $get_flags=0): false|array {}
1919
public function getMultiByKey(string $server_key, array $keys, int $get_flags=0): false|array {}
20-
public function getDelayed(array $keys, bool $with_cas=false, callable $value_cb=null): bool {}
21-
public function getDelayedByKey(string $server_key, array $keys, bool $with_cas=false, callable $value_cb=null): bool {}
20+
public function getDelayed(array $keys, bool $with_cas=false, ?callable $value_cb=null): bool {}
21+
public function getDelayedByKey(string $server_key, array $keys, bool $with_cas=false, ?callable $value_cb=null): bool {}
2222
public function fetch(): false|array {}
2323
public function fetchAll(): false|array {}
2424

@@ -64,7 +64,7 @@ public function getLastErrorCode(): int {}
6464
public function getLastErrorErrno(): int {}
6565
public function getLastDisconnectedServer(): false|array {}
6666

67-
public function getStats(string $type=null): false|array {}
67+
public function getStats(?string $type=null): false|array {}
6868
public function getVersion(): false|array {}
6969
public function getAllKeys(): false|array {}
7070

@@ -83,6 +83,7 @@ public function setEncodingKey(string $key): bool {}
8383
#endif
8484
public function isPersistent(): bool {}
8585
public function isPristine(): bool {}
86+
public function checkKey(string $key): bool {}
8687
}
8788

8889
#ifdef HAVE_MEMCACHED_PROTOCOL

php_memcached_arginfo.h

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/* This is a generated file, edit the .stub.php file instead.
2-
* Stub hash: 573d35c5c6b6c397943e0f8ab9c505e2f4ce9e34 */
2+
* Stub hash: 3f4694d4e1f3d1647a832acd8539b056b2ab5e7a */
33

44
ZEND_BEGIN_ARG_INFO_EX(arginfo_class_Memcached___construct, 0, 0, 0)
55
ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, persistent_id, IS_STRING, 1, "null")
@@ -249,6 +249,10 @@ ZEND_END_ARG_INFO()
249249

250250
#define arginfo_class_Memcached_isPristine arginfo_class_Memcached_resetServerList
251251

252+
ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_class_Memcached_checkKey, 0, 1, _IS_BOOL, 0)
253+
ZEND_ARG_TYPE_INFO(0, key, IS_STRING, 0)
254+
ZEND_END_ARG_INFO()
255+
252256
#if defined(HAVE_MEMCACHED_PROTOCOL)
253257
ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_class_MemcachedServer_run, 0, 1, _IS_BOOL, 0)
254258
ZEND_ARG_TYPE_INFO(0, address, IS_STRING, 0)
@@ -325,6 +329,7 @@ ZEND_METHOD(Memcached, setEncodingKey);
325329
#endif
326330
ZEND_METHOD(Memcached, isPersistent);
327331
ZEND_METHOD(Memcached, isPristine);
332+
ZEND_METHOD(Memcached, checkKey);
328333
#if defined(HAVE_MEMCACHED_PROTOCOL)
329334
ZEND_METHOD(MemcachedServer, run);
330335
#endif
@@ -396,6 +401,7 @@ static const zend_function_entry class_Memcached_methods[] = {
396401
#endif
397402
ZEND_ME(Memcached, isPersistent, arginfo_class_Memcached_isPersistent, ZEND_ACC_PUBLIC)
398403
ZEND_ME(Memcached, isPristine, arginfo_class_Memcached_isPristine, ZEND_ACC_PUBLIC)
404+
ZEND_ME(Memcached, checkKey, arginfo_class_Memcached_checkKey, ZEND_ACC_PUBLIC)
399405
ZEND_FE_END
400406
};
401407

php_memcached_legacy_arginfo.h

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/* This is a generated file, edit the .stub.php file instead.
2-
* Stub hash: 573d35c5c6b6c397943e0f8ab9c505e2f4ce9e34 */
2+
* Stub hash: 3f4694d4e1f3d1647a832acd8539b056b2ab5e7a */
33

44
ZEND_BEGIN_ARG_INFO_EX(arginfo_class_Memcached___construct, 0, 0, 0)
55
ZEND_ARG_INFO(0, persistent_id)
@@ -245,6 +245,10 @@ ZEND_END_ARG_INFO()
245245

246246
#define arginfo_class_Memcached_isPristine arginfo_class_Memcached_getResultCode
247247

248+
ZEND_BEGIN_ARG_INFO_EX(arginfo_class_Memcached_checkKey, 0, 0, 1)
249+
ZEND_ARG_INFO(0, key)
250+
ZEND_END_ARG_INFO()
251+
248252
#if defined(HAVE_MEMCACHED_PROTOCOL)
249253
ZEND_BEGIN_ARG_INFO_EX(arginfo_class_MemcachedServer_run, 0, 0, 1)
250254
ZEND_ARG_INFO(0, address)
@@ -321,6 +325,7 @@ ZEND_METHOD(Memcached, setEncodingKey);
321325
#endif
322326
ZEND_METHOD(Memcached, isPersistent);
323327
ZEND_METHOD(Memcached, isPristine);
328+
ZEND_METHOD(Memcached, checkKey);
324329
#if defined(HAVE_MEMCACHED_PROTOCOL)
325330
ZEND_METHOD(MemcachedServer, run);
326331
#endif
@@ -392,6 +397,7 @@ static const zend_function_entry class_Memcached_methods[] = {
392397
#endif
393398
ZEND_ME(Memcached, isPersistent, arginfo_class_Memcached_isPersistent, ZEND_ACC_PUBLIC)
394399
ZEND_ME(Memcached, isPristine, arginfo_class_Memcached_isPristine, ZEND_ACC_PUBLIC)
400+
ZEND_ME(Memcached, checkKey, arginfo_class_Memcached_checkKey, ZEND_ACC_PUBLIC)
395401
ZEND_FE_END
396402
};
397403

tests/check_key.phpt

Lines changed: 132 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,132 @@
1+
--TEST--
2+
Memcached::checkKey()
3+
--SKIPIF--
4+
<?php include "skipif.inc";?>
5+
--FILE--
6+
<?php
7+
include dirname (__FILE__) . '/config.inc';
8+
$m = memc_get_instance (array (
9+
Memcached::OPT_BINARY_PROTOCOL => false,
10+
Memcached::OPT_VERIFY_KEY => true
11+
));
12+
13+
$keys = [
14+
'foo',
15+
'foo bar',
16+
str_repeat('a',65),
17+
str_repeat('b',250),
18+
str_repeat('c',251),
19+
'Montréal',
20+
'København',
21+
'Düsseldorf',
22+
'Kraków',
23+
'İstanbul',
24+
'ﺎﺨﺘﺑﺍﺭ PHP',
25+
'測試',
26+
'Тестирование',
27+
'پی ایچ پی کی جانچ ہو رہی ہے',
28+
'Testataan PHP: tä',
29+
'Að prófa PHP',
30+
'د پی ایچ پی ازمول',
31+
'Pruvà PHP'
32+
];
33+
foreach($keys as $key) {
34+
echo "Checking \"$key\"" . PHP_EOL;
35+
echo "MEMC_CHECK_KEY: ";
36+
var_dump($m->checkKey($key));
37+
echo "libmemcached: ";
38+
var_dump($m->set($key, "this is a test"));
39+
var_dump($m->getResultMessage());
40+
echo "\n";
41+
}
42+
--EXPECT--
43+
Checking "foo"
44+
MEMC_CHECK_KEY: bool(true)
45+
libmemcached: bool(true)
46+
string(7) "SUCCESS"
47+
48+
Checking "foo bar"
49+
MEMC_CHECK_KEY: bool(false)
50+
libmemcached: bool(false)
51+
string(46) "A BAD KEY WAS PROVIDED/CHARACTERS OUT OF RANGE"
52+
53+
Checking "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
54+
MEMC_CHECK_KEY: bool(true)
55+
libmemcached: bool(true)
56+
string(7) "SUCCESS"
57+
58+
Checking "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb"
59+
MEMC_CHECK_KEY: bool(true)
60+
libmemcached: bool(true)
61+
string(7) "SUCCESS"
62+
63+
Checking "ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc"
64+
MEMC_CHECK_KEY: bool(false)
65+
libmemcached: bool(false)
66+
string(46) "A BAD KEY WAS PROVIDED/CHARACTERS OUT OF RANGE"
67+
68+
Checking "Montréal"
69+
MEMC_CHECK_KEY: bool(false)
70+
libmemcached: bool(false)
71+
string(46) "A BAD KEY WAS PROVIDED/CHARACTERS OUT OF RANGE"
72+
73+
Checking "København"
74+
MEMC_CHECK_KEY: bool(false)
75+
libmemcached: bool(false)
76+
string(46) "A BAD KEY WAS PROVIDED/CHARACTERS OUT OF RANGE"
77+
78+
Checking "Düsseldorf"
79+
MEMC_CHECK_KEY: bool(false)
80+
libmemcached: bool(false)
81+
string(46) "A BAD KEY WAS PROVIDED/CHARACTERS OUT OF RANGE"
82+
83+
Checking "Kraków"
84+
MEMC_CHECK_KEY: bool(false)
85+
libmemcached: bool(false)
86+
string(46) "A BAD KEY WAS PROVIDED/CHARACTERS OUT OF RANGE"
87+
88+
Checking "İstanbul"
89+
MEMC_CHECK_KEY: bool(false)
90+
libmemcached: bool(false)
91+
string(46) "A BAD KEY WAS PROVIDED/CHARACTERS OUT OF RANGE"
92+
93+
Checking "ﺎﺨﺘﺑﺍﺭ PHP"
94+
MEMC_CHECK_KEY: bool(false)
95+
libmemcached: bool(false)
96+
string(46) "A BAD KEY WAS PROVIDED/CHARACTERS OUT OF RANGE"
97+
98+
Checking "測試"
99+
MEMC_CHECK_KEY: bool(false)
100+
libmemcached: bool(false)
101+
string(46) "A BAD KEY WAS PROVIDED/CHARACTERS OUT OF RANGE"
102+
103+
Checking "Тестирование"
104+
MEMC_CHECK_KEY: bool(false)
105+
libmemcached: bool(false)
106+
string(46) "A BAD KEY WAS PROVIDED/CHARACTERS OUT OF RANGE"
107+
108+
Checking "پی ایچ پی کی جانچ ہو رہی ہے"
109+
MEMC_CHECK_KEY: bool(false)
110+
libmemcached: bool(false)
111+
string(46) "A BAD KEY WAS PROVIDED/CHARACTERS OUT OF RANGE"
112+
113+
Checking "Testataan PHP: tä"
114+
MEMC_CHECK_KEY: bool(false)
115+
libmemcached: bool(false)
116+
string(46) "A BAD KEY WAS PROVIDED/CHARACTERS OUT OF RANGE"
117+
118+
Checking "Að prófa PHP"
119+
MEMC_CHECK_KEY: bool(false)
120+
libmemcached: bool(false)
121+
string(46) "A BAD KEY WAS PROVIDED/CHARACTERS OUT OF RANGE"
122+
123+
Checking "د پی ایچ پی ازمول"
124+
MEMC_CHECK_KEY: bool(false)
125+
libmemcached: bool(false)
126+
string(46) "A BAD KEY WAS PROVIDED/CHARACTERS OUT OF RANGE"
127+
128+
Checking "Pruvà PHP"
129+
MEMC_CHECK_KEY: bool(false)
130+
libmemcached: bool(false)
131+
string(46) "A BAD KEY WAS PROVIDED/CHARACTERS OUT OF RANGE"
132+

0 commit comments

Comments
 (0)