summaryrefslogtreecommitdiff
path: root/src/sp_utils.c
diff options
context:
space:
mode:
authorjvoisin2018-10-09 09:46:05 +0000
committerGitHub2018-10-09 09:46:05 +0000
commit40cfba9328b9b27cfd2d2b66665780d9898cca2c (patch)
treebd2b156ac3c5db7ebe54a78ae8ef29ed119a7971 /src/sp_utils.c
parentb9c388d1718947f748042586cf77d9b1ce00c61e (diff)
Improve mb_string hooking logic
Diffstat (limited to 'src/sp_utils.c')
-rw-r--r--src/sp_utils.c22
1 files changed, 14 insertions, 8 deletions
diff --git a/src/sp_utils.c b/src/sp_utils.c
index d6d8c00..2de4d3b 100644
--- a/src/sp_utils.c
+++ b/src/sp_utils.c
@@ -328,7 +328,9 @@ int hook_function(const char* original_name, HashTable* hook_table,
328 328
329 if ((func = zend_hash_str_find_ptr(CG(function_table), 329 if ((func = zend_hash_str_find_ptr(CG(function_table),
330 VAR_AND_LEN(original_name)))) { 330 VAR_AND_LEN(original_name)))) {
331 if (func->handler != new_function) { 331 if (func->handler == new_function) {
332 return SUCCESS; // the function is already hooked
333 } else {
332 if (zend_hash_str_add_new_ptr((hook_table), VAR_AND_LEN(original_name), 334 if (zend_hash_str_add_new_ptr((hook_table), VAR_AND_LEN(original_name),
333 func->handler) == NULL) { 335 func->handler) == NULL) {
334 // LCOV_EXCL_START 336 // LCOV_EXCL_START
@@ -339,25 +341,29 @@ int hook_function(const char* original_name, HashTable* hook_table,
339 } 341 }
340 func->handler = new_function; 342 func->handler = new_function;
341 ret = SUCCESS; 343 ret = SUCCESS;
342 } else {
343 return SUCCESS;
344 } 344 }
345 } 345 }
346 346
347 if (0 == strncmp(original_name, "mb_", 3)) { 347 CG(compiler_options) |= ZEND_COMPILE_NO_BUILTIN_STRLEN;
348 CG(compiler_options) |= ZEND_COMPILE_NO_BUILTIN_STRLEN; 348
349 if (0 == strncmp(original_name, "mb_", 3) && !CG(multibyte)) {
349 if (zend_hash_str_find(CG(function_table), 350 if (zend_hash_str_find(CG(function_table),
350 VAR_AND_LEN(original_name + 3))) { 351 VAR_AND_LEN(original_name + 3))) {
351 return hook_function(original_name + 3, hook_table, new_function); 352 return hook_function(original_name + 3, hook_table, new_function);
352 } 353 }
353 } else { // TODO this can be moved somewhere else to gain some marginal perfs 354 } else if (CG(multibyte)) {
354 CG(compiler_options) |= ZEND_COMPILE_NO_BUILTIN_STRLEN; 355 // LCOV_EXCL_START
355 char* mb_name = ecalloc(strlen(original_name) + 3 + 1, 1); 356 char* mb_name = ecalloc(strlen(original_name) + 3 + 1, 1);
357 if (NULL == mb_name) {
358 return FAILURE;
359 }
356 memcpy(mb_name, "mb_", sizeof("mb_") - 1); 360 memcpy(mb_name, "mb_", sizeof("mb_") - 1);
357 memcpy(mb_name + 3, VAR_AND_LEN(original_name)); 361 memcpy(mb_name + 3, VAR_AND_LEN(original_name));
358 if (zend_hash_str_find(CG(function_table), VAR_AND_LEN(mb_name))) { 362 if (zend_hash_str_find(CG(function_table), VAR_AND_LEN(mb_name))) {
359 return hook_function(mb_name, hook_table, new_function); 363 return hook_function(mb_name, hook_table, new_function);
360 } 364 }
365 free(mb_name);
366 // LCOV_EXCL_STOP
361 } 367 }
362 368
363 return ret; 369 return ret;