@@ -2101,12 +2101,12 @@ void zend_do_begin_dynamic_function_call(znode *function_name, int ns_call TSRML
2101
2101
}
2102
2102
/* }}} */
2103
2103
2104
- void zend_resolve_non_class_name (znode * element_name , zend_bool check_namespace , HashTable * current_import_sub TSRMLS_DC ) /* {{{ */
2104
+ void zend_resolve_non_class_name (znode * element_name , zend_bool check_namespace , zend_bool case_sensitive , HashTable * current_import_sub TSRMLS_DC ) /* {{{ */
2105
2105
{
2106
2106
znode tmp ;
2107
2107
int len ;
2108
2108
zval * * ns ;
2109
- char * lcname , * compound = memchr (Z_STRVAL (element_name -> u .constant ), '\\' , Z_STRLEN (element_name -> u .constant ));
2109
+ char * lookup_name , * compound = memchr (Z_STRVAL (element_name -> u .constant ), '\\' , Z_STRLEN (element_name -> u .constant ));
2110
2110
2111
2111
if (Z_STRVAL (element_name -> u .constant )[0 ] == '\\' ) {
2112
2112
/* name starts with \ so it is known and unambiguos, nothing to do here but shorten it */
@@ -2121,23 +2121,31 @@ void zend_resolve_non_class_name(znode *element_name, zend_bool check_namespace,
2121
2121
2122
2122
if (current_import_sub ) {
2123
2123
len = Z_STRLEN (element_name -> u .constant )+ 1 ;
2124
- lcname = zend_str_tolower_dup (Z_STRVAL (element_name -> u .constant ), len );
2124
+ if (case_sensitive ) {
2125
+ lookup_name = estrndup (Z_STRVAL (element_name -> u .constant ), len );
2126
+ } else {
2127
+ lookup_name = zend_str_tolower_dup (Z_STRVAL (element_name -> u .constant ), len );
2128
+ }
2125
2129
/* Check if function/const matches imported name */
2126
- if (zend_hash_find (current_import_sub , lcname , len , (void * * )& ns ) == SUCCESS ) {
2130
+ if (zend_hash_find (current_import_sub , lookup_name , len , (void * * )& ns ) == SUCCESS ) {
2127
2131
zval_dtor (& element_name -> u .constant );
2128
2132
element_name -> u .constant = * * ns ;
2129
2133
zval_copy_ctor (& element_name -> u .constant );
2130
- efree (lcname );
2134
+ efree (lookup_name );
2131
2135
return ;
2132
2136
}
2133
- efree (lcname );
2137
+ efree (lookup_name );
2134
2138
}
2135
2139
2136
2140
if (compound && CG (current_import )) {
2137
2141
len = compound - Z_STRVAL (element_name -> u .constant );
2138
- lcname = zend_str_tolower_dup (Z_STRVAL (element_name -> u .constant ), len );
2142
+ if (case_sensitive ) {
2143
+ lookup_name = estrndup (Z_STRVAL (element_name -> u .constant ), len );
2144
+ } else {
2145
+ lookup_name = zend_str_tolower_dup (Z_STRVAL (element_name -> u .constant ), len );
2146
+ }
2139
2147
/* Check if first part of compound name is an import name */
2140
- if (zend_hash_find (CG (current_import ), lcname , len + 1 , (void * * )& ns ) == SUCCESS ) {
2148
+ if (zend_hash_find (CG (current_import ), lookup_name , len + 1 , (void * * )& ns ) == SUCCESS ) {
2141
2149
/* Substitute import name */
2142
2150
tmp .op_type = IS_CONST ;
2143
2151
tmp .u .constant = * * ns ;
@@ -2147,10 +2155,10 @@ void zend_resolve_non_class_name(znode *element_name, zend_bool check_namespace,
2147
2155
memmove (Z_STRVAL (element_name -> u .constant ), Z_STRVAL (element_name -> u .constant )+ len , Z_STRLEN (element_name -> u .constant )+ 1 );
2148
2156
zend_do_build_namespace_name (& tmp , & tmp , element_name TSRMLS_CC );
2149
2157
* element_name = tmp ;
2150
- efree (lcname );
2158
+ efree (lookup_name );
2151
2159
return ;
2152
2160
}
2153
- efree (lcname );
2161
+ efree (lookup_name );
2154
2162
}
2155
2163
2156
2164
if (CG (current_namespace )) {
@@ -2168,13 +2176,13 @@ void zend_resolve_non_class_name(znode *element_name, zend_bool check_namespace,
2168
2176
2169
2177
void zend_resolve_function_name (znode * element_name , zend_bool check_namespace TSRMLS_DC ) /* {{{ */
2170
2178
{
2171
- zend_resolve_non_class_name (element_name , check_namespace , CG (current_import_function ) TSRMLS_CC );
2179
+ zend_resolve_non_class_name (element_name , check_namespace , 0 , CG (current_import_function ) TSRMLS_CC );
2172
2180
}
2173
2181
/* }}} */
2174
2182
2175
2183
void zend_resolve_const_name (znode * element_name , zend_bool check_namespace TSRMLS_DC ) /* {{{ */
2176
2184
{
2177
- zend_resolve_non_class_name (element_name , check_namespace , CG (current_import_const ) TSRMLS_CC );
2185
+ zend_resolve_non_class_name (element_name , check_namespace , 1 , CG (current_import_const ) TSRMLS_CC );
2178
2186
}
2179
2187
/* }}} */
2180
2188
@@ -7152,9 +7160,9 @@ void zend_do_use(znode *ns_name, znode *new_name, int is_global TSRMLS_DC) /* {{
7152
7160
}
7153
7161
/* }}} */
7154
7162
7155
- void zend_do_use_non_class (znode * ns_name , znode * new_name , int is_global , const char * type , HashTable * current_import_sub , HashTable * lookup_table TSRMLS_DC ) /* {{{ */
7163
+ void zend_do_use_non_class (znode * ns_name , znode * new_name , int is_global , const char * type , zend_bool case_sensitive , HashTable * current_import_sub , HashTable * lookup_table TSRMLS_DC ) /* {{{ */
7156
7164
{
7157
- char * lcname ;
7165
+ char * lookup_name ;
7158
7166
char * filename ;
7159
7167
zval * name , * ns , tmp ;
7160
7168
zend_bool warn = 0 ;
@@ -7179,15 +7187,19 @@ void zend_do_use_non_class(znode *ns_name, znode *new_name, int is_global, const
7179
7187
}
7180
7188
}
7181
7189
7182
- lcname = zend_str_tolower_dup (Z_STRVAL_P (name ), Z_STRLEN_P (name ));
7190
+ if (case_sensitive ) {
7191
+ lookup_name = estrndup (Z_STRVAL_P (name ), Z_STRLEN_P (name ));
7192
+ } else {
7193
+ lookup_name = zend_str_tolower_dup (Z_STRVAL_P (name ), Z_STRLEN_P (name ));
7194
+ }
7183
7195
7184
7196
if (CG (current_namespace )) {
7185
7197
/* Prefix import name with current namespace name to avoid conflicts with functions/consts */
7186
7198
char * c_ns_name = emalloc (Z_STRLEN_P (CG (current_namespace )) + 1 + Z_STRLEN_P (name ) + 1 );
7187
7199
7188
7200
zend_str_tolower_copy (c_ns_name , Z_STRVAL_P (CG (current_namespace )), Z_STRLEN_P (CG (current_namespace )));
7189
7201
c_ns_name [Z_STRLEN_P (CG (current_namespace ))] = '\\' ;
7190
- memcpy (c_ns_name + Z_STRLEN_P (CG (current_namespace ))+ 1 , lcname , Z_STRLEN_P (name )+ 1 );
7202
+ memcpy (c_ns_name + Z_STRLEN_P (CG (current_namespace ))+ 1 , lookup_name , Z_STRLEN_P (name )+ 1 );
7191
7203
if (zend_hash_exists (lookup_table , c_ns_name , Z_STRLEN_P (CG (current_namespace )) + 1 + Z_STRLEN_P (name )+ 1 )) {
7192
7204
char * tmp2 = zend_str_tolower_dup (Z_STRVAL_P (ns ), Z_STRLEN_P (ns ));
7193
7205
@@ -7198,23 +7210,23 @@ void zend_do_use_non_class(znode *ns_name, znode *new_name, int is_global, const
7198
7210
efree (tmp2 );
7199
7211
}
7200
7212
efree (c_ns_name );
7201
- } else if (zend_hash_find (lookup_table , lcname , Z_STRLEN_P (name )+ 1 , (void * * )& filename ) == SUCCESS && strcmp (filename , CG (compiled_filename )) == 0 ) {
7213
+ } else if (zend_hash_find (lookup_table , lookup_name , Z_STRLEN_P (name )+ 1 , (void * * )& filename ) == SUCCESS && strcmp (filename , CG (compiled_filename )) == 0 ) {
7202
7214
char * c_tmp = zend_str_tolower_dup (Z_STRVAL_P (ns ), Z_STRLEN_P (ns ));
7203
7215
7204
7216
if (Z_STRLEN_P (ns ) != Z_STRLEN_P (name ) ||
7205
- memcmp (c_tmp , lcname , Z_STRLEN_P (ns ))) {
7217
+ memcmp (c_tmp , lookup_name , Z_STRLEN_P (ns ))) {
7206
7218
zend_error (E_COMPILE_ERROR , "Cannot use %s %s as %s because the name is already in use" , type , Z_STRVAL_P (ns ), Z_STRVAL_P (name ));
7207
7219
}
7208
7220
efree (c_tmp );
7209
7221
}
7210
7222
7211
- if (zend_hash_add (current_import_sub , lcname , Z_STRLEN_P (name )+ 1 , & ns , sizeof (zval * ), NULL ) != SUCCESS ) {
7223
+ if (zend_hash_add (current_import_sub , lookup_name , Z_STRLEN_P (name )+ 1 , & ns , sizeof (zval * ), NULL ) != SUCCESS ) {
7212
7224
zend_error (E_COMPILE_ERROR , "Cannot use %s as %s because the name is already in use" , Z_STRVAL_P (ns ), Z_STRVAL_P (name ));
7213
7225
}
7214
7226
if (warn ) {
7215
7227
zend_error (E_WARNING , "The use statement with non-compound name '%s' has no effect" , Z_STRVAL_P (name ));
7216
7228
}
7217
- efree (lcname );
7229
+ efree (lookup_name );
7218
7230
zval_dtor (name );
7219
7231
}
7220
7232
/* }}} */
@@ -7226,7 +7238,7 @@ void zend_do_use_function(znode *ns_name, znode *new_name, int is_global TSRMLS_
7226
7238
zend_hash_init (CG (current_import_function ), 0 , NULL , ZVAL_PTR_DTOR , 0 );
7227
7239
}
7228
7240
7229
- zend_do_use_non_class (ns_name , new_name , is_global , "function" , CG (current_import_function ), & CG (function_filenames ) TSRMLS_CC );
7241
+ zend_do_use_non_class (ns_name , new_name , is_global , "function" , 0 , CG (current_import_function ), & CG (function_filenames ) TSRMLS_CC );
7230
7242
}
7231
7243
/* }}} */
7232
7244
@@ -7237,7 +7249,7 @@ void zend_do_use_const(znode *ns_name, znode *new_name, int is_global TSRMLS_DC)
7237
7249
zend_hash_init (CG (current_import_const ), 0 , NULL , ZVAL_PTR_DTOR , 0 );
7238
7250
}
7239
7251
7240
- zend_do_use_non_class (ns_name , new_name , is_global , "const" , CG (current_import_const ), & CG (const_filenames ) TSRMLS_CC );
7252
+ zend_do_use_non_class (ns_name , new_name , is_global , "const" , 1 , CG (current_import_const ), & CG (const_filenames ) TSRMLS_CC );
7241
7253
}
7242
7254
/* }}} */
7243
7255
@@ -7269,7 +7281,7 @@ void zend_do_declare_constant(znode *name, znode *value TSRMLS_DC) /* {{{ */
7269
7281
if (CG (current_import_const ) &&
7270
7282
zend_hash_find (CG (current_import_const ), Z_STRVAL (name -> u .constant ), Z_STRLEN (name -> u .constant )+ 1 , (void * * )& ns_name ) == SUCCESS ) {
7271
7283
7272
- char * tmp = zend_str_tolower_dup (Z_STRVAL_PP (ns_name ), Z_STRLEN_PP (ns_name ));
7284
+ char * tmp = estrndup (Z_STRVAL_PP (ns_name ), Z_STRLEN_PP (ns_name ));
7273
7285
7274
7286
if (Z_STRLEN_PP (ns_name ) != Z_STRLEN (name -> u .constant ) ||
7275
7287
memcmp (tmp , Z_STRVAL (name -> u .constant ), Z_STRLEN (name -> u .constant ))) {
0 commit comments