File tree Expand file tree Collapse file tree 2 files changed +19
-2
lines changed Expand file tree Collapse file tree 2 files changed +19
-2
lines changed Original file line number Diff line number Diff line change @@ -1512,4 +1512,9 @@ static zend_always_inline bool zend_may_modify_arg_in_place(const zval *arg)
15121512 return Z_REFCOUNTED_P (arg ) && !(GC_FLAGS (Z_COUNTED_P (arg )) & (GC_IMMUTABLE | GC_PERSISTENT )) && Z_REFCOUNT_P (arg ) == 1 ;
15131513}
15141514
1515+ static zend_always_inline bool zend_may_modify_string_in_place (const zend_string * arg )
1516+ {
1517+ return !(GC_FLAGS (arg ) & (GC_IMMUTABLE | GC_PERSISTENT )) && GC_REFCOUNT (arg ) == 1 ;
1518+ }
1519+
15151520#endif /* ZEND_TYPES_H */
Original file line number Diff line number Diff line change @@ -2341,7 +2341,13 @@ static zend_string* php_ucfirst(zend_string *str)
23412341 if (r == ch ) {
23422342 return zend_string_copy (str );
23432343 } else {
2344- zend_string * s = zend_string_init (ZSTR_VAL (str ), ZSTR_LEN (str ), 0 );
2344+ zend_string * s ;
2345+ if (zend_may_modify_string_in_place (str )) {
2346+ s = str ;
2347+ zend_string_forget_hash_val (s );
2348+ } else {
2349+ s = zend_string_init (ZSTR_VAL (str ), ZSTR_LEN (str ), false);
2350+ }
23452351 ZSTR_VAL (s )[0 ] = r ;
23462352 return s ;
23472353 }
@@ -2373,7 +2379,13 @@ static zend_string* php_lcfirst(zend_string *str)
23732379 if (r == ZSTR_VAL (str )[0 ]) {
23742380 return zend_string_copy (str );
23752381 } else {
2376- zend_string * s = zend_string_init (ZSTR_VAL (str ), ZSTR_LEN (str ), 0 );
2382+ zend_string * s ;
2383+ if (zend_may_modify_string_in_place (str )) {
2384+ s = str ;
2385+ zend_string_forget_hash_val (s );
2386+ } else {
2387+ s = zend_string_init (ZSTR_VAL (str ), ZSTR_LEN (str ), false);
2388+ }
23772389 ZSTR_VAL (s )[0 ] = r ;
23782390 return s ;
23792391 }
You can’t perform that action at this time.
0 commit comments