Skip to content

Commit

Permalink
Correctly treat class names as case insensitive
Browse files Browse the repository at this point in the history
  • Loading branch information
morrisonlevi committed Sep 13, 2019
1 parent bef4bca commit a315d73
Show file tree
Hide file tree
Showing 4 changed files with 42 additions and 6 deletions.
1 change: 1 addition & 0 deletions package.xml
Original file line number Diff line number Diff line change
Expand Up @@ -94,6 +94,7 @@
<file name="access_modifier_method_access_hook.phpt" role="test" />
<file name="access_modifier_property_access_hook.phpt" role="test" />
<file name="allow_overriding_before_overrided_methods_functions_are_defined.phpt" role="test" />
<file name="case_insensitive_class_hook.phpt" role="test" />
<file name="case_insensitive_method_hook.phpt" role="test" />
<file name="closure_accessing_outside_variables.phpt" role="test" />
<file name="closure_set_inside_object_methods.phpt" role="test" />
Expand Down
12 changes: 7 additions & 5 deletions src/ext/dispatch.c
Original file line number Diff line number Diff line change
Expand Up @@ -43,14 +43,16 @@ static ddtrace_dispatch_t *find_method_dispatch(const zend_class_entry *class, z
}
HashTable *class_lookup = NULL;

// downcase the class name as they are case insensitive
#if PHP_VERSION_ID < 70000
const char *class_name = NULL;
size_t class_name_length = 0;
class_name = class->name;
class_name_length = class->name_length;
size_t class_name_length = class->name_length;
char *class_name = zend_str_tolower_dup(class->name, class_name_length);
class_lookup = zend_hash_str_find_ptr(DDTRACE_G(class_lookup), class_name, class_name_length);
efree(class_name);
#else
class_lookup = zend_hash_find_ptr(DDTRACE_G(class_lookup), class->name);
zend_string *class_name = zend_string_tolower(class->name);
class_lookup = zend_hash_find_ptr(DDTRACE_G(class_lookup), class_name);
zend_string_release(class_name);
#endif

ddtrace_dispatch_t *dispatch = NULL;
Expand Down
13 changes: 12 additions & 1 deletion src/ext/dispatch_setup.c
Original file line number Diff line number Diff line change
Expand Up @@ -93,14 +93,25 @@ zend_bool ddtrace_trace(zval *class_name, zval *function_name, zval *callable, z
HashTable *overridable_lookup = NULL;
if (class_name && DDTRACE_G(class_lookup)) {
#if PHP_VERSION_ID < 70000
// downcase the class name before lookup as class names are case insensitive.
zval *class_name_prev = class_name;
MAKE_STD_ZVAL(class_name);
ZVAL_STRING(class_name, Z_STRVAL_P(class_name_prev), 1);
ddtrace_downcase_zval(class_name);
overridable_lookup =
zend_hash_str_find_ptr(DDTRACE_G(class_lookup), Z_STRVAL_P(class_name), Z_STRLEN_P(class_name));
if (!overridable_lookup) {
overridable_lookup = ddtrace_new_class_lookup(class_name TSRMLS_CC);
}
zval_ptr_dtor(&class_name);
class_name = class_name_prev;
#else
ddtrace_downcase_zval(class_name);
overridable_lookup = zend_hash_find_ptr(DDTRACE_G(class_lookup), Z_STR_P(class_name));
#endif
if (!overridable_lookup) {
overridable_lookup = ddtrace_new_class_lookup(class_name TSRMLS_CC);
}
#endif
} else {
if (DDTRACE_G(strict_mode)) {
zend_function *function = NULL;
Expand Down
22 changes: 22 additions & 0 deletions tests/ext/case_insensitive_class_hook.phpt
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
--TEST--
Check if for case insensitive class name support
--FILE--
<?php
class Base {
public function method(){
echo __METHOD__ . PHP_EOL;
}
}

dd_trace("base", "method", function () {
echo "HOOK ";
return dd_trace_forward_call();
});

(new Base())->method();
(new base())->method();

?>
--EXPECT--
HOOK Base::method
HOOK Base::method

0 comments on commit a315d73

Please sign in to comment.