Skip to content

Commit a8fdb0f

Browse files
author
Andrei Zmievski
committed
Fix crash when child class does not call constructor.
1 parent 67d2b5b commit a8fdb0f

File tree

1 file changed

+25
-19
lines changed

1 file changed

+25
-19
lines changed

php_memcached.c

Lines changed: 25 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -81,6 +81,10 @@
8181

8282
#define MEMC_METHOD_FETCH_OBJECT \
8383
i_obj = (php_memc_t *) zend_object_store_get_object( object TSRMLS_CC ); \
84+
if (!i_obj->memc) { \
85+
php_error_docref(NULL TSRMLS_CC, E_WARNING, "Memcached constructor was not called"); \
86+
return; \
87+
} \
8488

8589
#ifndef DVAL_TO_LVAL
8690
#ifdef _WIN64
@@ -324,14 +328,14 @@ static void php_memc_get_impl(INTERNAL_FUNCTION_PARAMETERS, zend_bool by_key)
324328
}
325329
}
326330

331+
MEMC_METHOD_FETCH_OBJECT;
332+
MEMC_G(rescode) = MEMCACHED_SUCCESS;
333+
327334
if (key_len == 0) {
328335
MEMC_G(rescode) = MEMCACHED_BAD_KEY_PROVIDED;
329336
RETURN_FALSE;
330337
}
331338

332-
MEMC_METHOD_FETCH_OBJECT;
333-
MEMC_G(rescode) = MEMCACHED_SUCCESS;
334-
335339
if (cas_token) {
336340

337341
uint64_t orig_cas_flag;
@@ -1060,14 +1064,14 @@ static void php_memc_store_impl(INTERNAL_FUNCTION_PARAMETERS, int op, zend_bool
10601064
server_key_len = key_len;
10611065
}
10621066

1067+
MEMC_METHOD_FETCH_OBJECT;
1068+
MEMC_G(rescode) = MEMCACHED_SUCCESS;
1069+
10631070
if (key_len == 0) {
10641071
MEMC_G(rescode) = MEMCACHED_BAD_KEY_PROVIDED;
10651072
RETURN_FALSE;
10661073
}
10671074

1068-
MEMC_METHOD_FETCH_OBJECT;
1069-
MEMC_G(rescode) = MEMCACHED_SUCCESS;
1070-
10711075
if (i_obj->compression) {
10721076
/*
10731077
* When compression is enabled, we cannot do appends/prepends because that would
@@ -1182,14 +1186,14 @@ static void php_memc_cas_impl(INTERNAL_FUNCTION_PARAMETERS, zend_bool by_key)
11821186
server_key_len = key_len;
11831187
}
11841188

1189+
MEMC_METHOD_FETCH_OBJECT;
1190+
MEMC_G(rescode) = MEMCACHED_SUCCESS;
1191+
11851192
if (key_len == 0) {
11861193
MEMC_G(rescode) = MEMCACHED_BAD_KEY_PROVIDED;
11871194
RETURN_FALSE;
11881195
}
11891196

1190-
MEMC_METHOD_FETCH_OBJECT;
1191-
MEMC_G(rescode) = MEMCACHED_SUCCESS;
1192-
11931197
DVAL_TO_LVAL(cas_d, cas);
11941198

11951199
if (i_obj->compression) {
@@ -1257,14 +1261,14 @@ static void php_memc_delete_impl(INTERNAL_FUNCTION_PARAMETERS, zend_bool by_key)
12571261
server_key_len = key_len;
12581262
}
12591263

1264+
MEMC_METHOD_FETCH_OBJECT;
1265+
MEMC_G(rescode) = MEMCACHED_SUCCESS;
1266+
12601267
if (key_len == 0) {
12611268
MEMC_G(rescode) = MEMCACHED_BAD_KEY_PROVIDED;
12621269
RETURN_FALSE;
12631270
}
12641271

1265-
MEMC_METHOD_FETCH_OBJECT;
1266-
MEMC_G(rescode) = MEMCACHED_SUCCESS;
1267-
12681272
status = memcached_delete_by_key(i_obj->memc, server_key, server_key_len, key,
12691273
key_len, expiration);
12701274

@@ -1306,6 +1310,9 @@ static void php_memc_incdec_impl(INTERNAL_FUNCTION_PARAMETERS, zend_bool incr)
13061310
return;
13071311
}
13081312

1313+
MEMC_METHOD_FETCH_OBJECT;
1314+
MEMC_G(rescode) = MEMCACHED_SUCCESS;
1315+
13091316
if (key_len == 0) {
13101317
MEMC_G(rescode) = MEMCACHED_BAD_KEY_PROVIDED;
13111318
RETURN_FALSE;
@@ -1316,9 +1323,6 @@ static void php_memc_incdec_impl(INTERNAL_FUNCTION_PARAMETERS, zend_bool incr)
13161323
RETURN_FALSE;
13171324
}
13181325

1319-
MEMC_METHOD_FETCH_OBJECT;
1320-
MEMC_G(rescode) = MEMCACHED_SUCCESS;
1321-
13221326
if (incr) {
13231327
status = memcached_increment(i_obj->memc, key, key_len, (unsigned int)offset, &value);
13241328
} else {
@@ -1473,14 +1477,14 @@ PHP_METHOD(Memcached, getServerByKey)
14731477
return;
14741478
}
14751479

1480+
MEMC_METHOD_FETCH_OBJECT;
1481+
MEMC_G(rescode) = MEMCACHED_SUCCESS;
1482+
14761483
if (server_key_len == 0) {
14771484
MEMC_G(rescode) = MEMCACHED_BAD_KEY_PROVIDED;
14781485
RETURN_FALSE;
14791486
}
14801487

1481-
MEMC_METHOD_FETCH_OBJECT;
1482-
MEMC_G(rescode) = MEMCACHED_SUCCESS;
1483-
14841488
server = memcached_server_by_key(i_obj->memc, server_key, server_key_len, &error);
14851489
if (server == NULL) {
14861490
php_memc_handle_error(error TSRMLS_CC);
@@ -1758,7 +1762,9 @@ static PHP_METHOD(Memcached, getResultCode)
17581762
/* {{{ constructor/destructor */
17591763
static void php_memc_destroy(php_memc_t *i_obj TSRMLS_DC)
17601764
{
1761-
memcached_free(i_obj->memc);
1765+
if (i_obj->memc) {
1766+
memcached_free(i_obj->memc);
1767+
}
17621768

17631769
pefree(i_obj, i_obj->is_persistent);
17641770
}

0 commit comments

Comments
 (0)