@@ -1169,8 +1169,11 @@ static zend_never_inline void zend_binary_assign_op_obj_dim(zval *object, zval *
1169
1169
static void zend_assign_to_string_offset (zval * str , zend_long offset , zval * value , zval * result )
1170
1170
{
1171
1171
zend_string * old_str ;
1172
+ zend_uchar c ;
1173
+ size_t string_len ;
1172
1174
1173
1175
if (offset < 0 ) {
1176
+ /* Error on negative offset */
1174
1177
zend_error (E_WARNING , "Illegal string offset: " ZEND_LONG_FMT , offset );
1175
1178
zend_string_release (Z_STR_P (str ));
1176
1179
if (result ) {
@@ -1179,8 +1182,31 @@ static void zend_assign_to_string_offset(zval *str, zend_long offset, zval *valu
1179
1182
return ;
1180
1183
}
1181
1184
1185
+ if (Z_TYPE_P (value ) != IS_STRING ) {
1186
+ /* Convert to string, just the time to pick the 1st byte */
1187
+ zend_string * tmp = zval_get_string (value );
1188
+
1189
+ string_len = ZSTR_LEN (tmp );
1190
+ c = (zend_uchar )ZSTR_VAL (tmp )[0 ];
1191
+ zend_string_release (tmp );
1192
+ } else {
1193
+ string_len = Z_STRLEN_P (value );
1194
+ c = (zend_uchar )Z_STRVAL_P (value )[0 ];
1195
+ }
1196
+
1197
+ if (string_len == 0 ) {
1198
+ /* Error on empty input string */
1199
+ zend_error (E_WARNING , "Cannot assign an empty string to a string offset" );
1200
+ zend_string_release (Z_STR_P (str ));
1201
+ if (result ) {
1202
+ ZVAL_NULL (result );
1203
+ }
1204
+ return ;
1205
+ }
1206
+
1182
1207
old_str = Z_STR_P (str );
1183
1208
if ((size_t )offset >= Z_STRLEN_P (str )) {
1209
+ /* Extend string if needed */
1184
1210
zend_long old_len = Z_STRLEN_P (str );
1185
1211
Z_STR_P (str ) = zend_string_extend (Z_STR_P (str ), offset + 1 , 0 );
1186
1212
Z_TYPE_INFO_P (str ) = IS_STRING_EX ;
@@ -1191,23 +1217,11 @@ static void zend_assign_to_string_offset(zval *str, zend_long offset, zval *valu
1191
1217
Z_TYPE_INFO_P (str ) = IS_STRING_EX ;
1192
1218
}
1193
1219
1194
- if (Z_TYPE_P (value ) != IS_STRING ) {
1195
- zend_string * tmp = zval_get_string (value );
1196
-
1197
- Z_STRVAL_P (str )[offset ] = ZSTR_VAL (tmp )[0 ];
1198
- zend_string_release (tmp );
1199
- } else {
1200
- Z_STRVAL_P (str )[offset ] = Z_STRVAL_P (value )[0 ];
1201
- }
1202
- /*
1203
- * the value of an assignment to a string offset is undefined
1204
- T(result->u.var).var = &T->str_offset.str;
1205
- */
1220
+ Z_STRVAL_P (str )[offset ] = c ;
1206
1221
1207
1222
zend_string_release (old_str );
1208
1223
if (result ) {
1209
- zend_uchar c = (zend_uchar )Z_STRVAL_P (str )[offset ];
1210
-
1224
+ /* Return the new character */
1211
1225
if (CG (one_char_string )[c ]) {
1212
1226
ZVAL_INTERNED_STR (result , CG (one_char_string )[c ]);
1213
1227
} else {
0 commit comments