@@ -1091,13 +1091,14 @@ static void spl_heap_serialize_properties(zval *return_value, spl_heap_object *i
1091
1091
{
1092
1092
HashTable * props = zend_std_get_properties (& intern -> std );
1093
1093
1094
- ZVAL_ARR (return_value , props ? zend_array_dup (props ) : zend_new_array (0 ));
1094
+ ZVAL_ARR (return_value , props );
1095
+ GC_ADDREF (props );
1095
1096
}
1096
1097
1097
1098
static void spl_heap_serialize_internal_state (zval * return_value , spl_heap_object * intern , bool is_pqueue )
1098
1099
{
1099
- zval heap_elements ;
1100
- int heap_count = intern -> heap -> count ;
1100
+ zval heap_elements ;
1101
+ int heap_count = intern -> heap -> count ;
1101
1102
1102
1103
array_init (return_value );
1103
1104
add_assoc_long (return_value , "flags" , intern -> flags );
@@ -1113,9 +1114,9 @@ static void spl_heap_serialize_internal_state(zval *return_value, spl_heap_objec
1113
1114
spl_pqueue_elem * elem = spl_heap_elem (intern -> heap , heap_idx );
1114
1115
zval entry ;
1115
1116
array_init (& entry );
1116
- add_assoc_zval_ex (& entry , "data" , sizeof ("data" ) - 1 , & elem -> data );
1117
+ add_assoc_zval_ex (& entry , "data" , strlen ("data" ), & elem -> data );
1117
1118
Z_TRY_ADDREF (elem -> data );
1118
- add_assoc_zval_ex (& entry , "priority" , sizeof ("priority" ) - 1 , & elem -> priority );
1119
+ add_assoc_zval_ex (& entry , "priority" , strlen ("priority" ), & elem -> priority );
1119
1120
Z_TRY_ADDREF (elem -> priority );
1120
1121
zend_hash_next_index_insert (Z_ARRVAL (heap_elements ), & entry );
1121
1122
} else {
@@ -1135,42 +1136,52 @@ static void spl_heap_unserialize_properties(HashTable *props_ht, spl_heap_object
1135
1136
return ;
1136
1137
}
1137
1138
1138
- zend_throw_exception_ex (NULL , 0 , "Invalid serialization data for %s object" , ZSTR_VAL (intern -> std .ce -> name ));
1139
+ zend_throw_exception_ex (NULL , 0 , "Invalid serialization data for %s object" , ZSTR_VAL (intern -> std .ce -> name ));
1139
1140
}
1140
1141
1141
1142
static void spl_heap_unserialize_internal_state (HashTable * state_ht , spl_heap_object * intern , zval * this_ptr , bool is_pqueue )
1142
1143
{
1143
- zval * flags_val = zend_hash_str_find (state_ht , "flags" , sizeof ("flags" ) - 1 );
1144
+ zval * flags_val = zend_hash_str_find (state_ht , "flags" , strlen ("flags" ));
1144
1145
if (!flags_val || Z_TYPE_P (flags_val ) != IS_LONG ) {
1145
- zend_throw_exception_ex (NULL , 0 , "Invalid serialization data for %s object: missing or invalid flags " , ZSTR_VAL (intern -> std .ce -> name ));
1146
+ zend_throw_exception_ex (NULL , 0 , "Invalid serialization data for %s object" , ZSTR_VAL (intern -> std .ce -> name ));
1146
1147
return ;
1147
1148
}
1148
1149
1149
- intern -> flags = ( int ) Z_LVAL_P (flags_val );
1150
+ zend_long flags_value = Z_LVAL_P (flags_val );
1150
1151
1151
- zval * heap_elements = zend_hash_str_find (state_ht , "heap_elements" , sizeof ("heap_elements" ) - 1 );
1152
+ if (is_pqueue ) {
1153
+ flags_value &= SPL_PQUEUE_EXTR_MASK ;
1154
+ if (!flags_value ) {
1155
+ zend_throw_exception_ex (NULL , 0 , "Invalid serialization data for %s object" , ZSTR_VAL (intern -> std .ce -> name ));
1156
+ return ;
1157
+ }
1158
+ }
1159
+
1160
+ intern -> flags = (int ) flags_value ;
1161
+
1162
+ zval * heap_elements = zend_hash_str_find (state_ht , "heap_elements" , strlen ("heap_elements" ));
1152
1163
if (!heap_elements ) {
1164
+ zend_throw_exception_ex (NULL , 0 , "Invalid serialization data for %s object" , ZSTR_VAL (intern -> std .ce -> name ));
1153
1165
return ;
1154
1166
}
1155
1167
1156
1168
if (Z_TYPE_P (heap_elements ) != IS_ARRAY ) {
1157
- zend_throw_exception_ex (NULL , 0 , "Invalid serialization data for %s object: heap_elements must be an array " , ZSTR_VAL (intern -> std .ce -> name ));
1169
+ zend_throw_exception_ex (NULL , 0 , "Invalid serialization data for %s object" , ZSTR_VAL (intern -> std .ce -> name ));
1158
1170
return ;
1159
1171
}
1160
1172
1161
- zval * val ;
1162
- ZEND_HASH_FOREACH_VAL (Z_ARRVAL_P (heap_elements ), val ) {
1173
+ ZEND_HASH_FOREACH_VAL (Z_ARRVAL_P (heap_elements ), zval * val ) {
1163
1174
if (is_pqueue ) {
1164
1175
if (Z_TYPE_P (val ) != IS_ARRAY ) {
1165
- zend_throw_exception_ex (NULL , 0 , "Invalid serialization data for %s object: priority queue elements must be arrays " , ZSTR_VAL (intern -> std .ce -> name ));
1176
+ zend_throw_exception_ex (NULL , 0 , "Invalid serialization data for %s object" , ZSTR_VAL (intern -> std .ce -> name ));
1166
1177
return ;
1167
1178
}
1168
1179
1169
- zval * data_val = zend_hash_str_find (Z_ARRVAL_P (val ), "data" , sizeof ("data" ) - 1 );
1170
- zval * priority_val = zend_hash_str_find (Z_ARRVAL_P (val ), "priority" , sizeof ("priority" ) - 1 );
1180
+ zval * data_val = zend_hash_str_find (Z_ARRVAL_P (val ), "data" , strlen ("data" ) );
1181
+ zval * priority_val = zend_hash_str_find (Z_ARRVAL_P (val ), "priority" , strlen ("priority" ));
1171
1182
1172
1183
if (!data_val || !priority_val ) {
1173
- zend_throw_exception_ex (NULL , 0 , "Invalid serialization data for %s object: priority queue elements must have data and priority " , ZSTR_VAL (intern -> std .ce -> name ));
1184
+ zend_throw_exception_ex (NULL , 0 , "Invalid serialization data for %s object" , ZSTR_VAL (intern -> std .ce -> name ));
1174
1185
return ;
1175
1186
}
1176
1187
@@ -1205,7 +1216,6 @@ PHP_METHOD(SplPriorityQueue, __unserialize)
1205
1216
{
1206
1217
HashTable * data ;
1207
1218
spl_heap_object * intern = Z_SPLHEAP_P (ZEND_THIS );
1208
- zval * props , * state ;
1209
1219
1210
1220
ZEND_PARSE_PARAMETERS_START (1 , 1 )
1211
1221
Z_PARAM_ARRAY_HT (data )
@@ -1216,7 +1226,7 @@ PHP_METHOD(SplPriorityQueue, __unserialize)
1216
1226
RETURN_THROWS ();
1217
1227
}
1218
1228
1219
- props = zend_hash_index_find (data , 0 );
1229
+ zval * props = zend_hash_index_find (data , 0 );
1220
1230
if (!props || Z_TYPE_P (props ) != IS_ARRAY ) {
1221
1231
zend_throw_exception_ex (NULL , 0 , "Invalid serialization data for %s object" , ZSTR_VAL (intern -> std .ce -> name ));
1222
1232
RETURN_THROWS ();
@@ -1227,13 +1237,16 @@ PHP_METHOD(SplPriorityQueue, __unserialize)
1227
1237
RETURN_THROWS ();
1228
1238
}
1229
1239
1230
- state = zend_hash_index_find (data , 1 );
1240
+ zval * state = zend_hash_index_find (data , 1 );
1231
1241
if (!state || Z_TYPE_P (state ) != IS_ARRAY ) {
1232
1242
zend_throw_exception_ex (NULL , 0 , "Invalid serialization data for %s object" , ZSTR_VAL (intern -> std .ce -> name ));
1233
1243
RETURN_THROWS ();
1234
1244
}
1235
1245
1236
1246
spl_heap_unserialize_internal_state (Z_ARRVAL_P (state ), intern , ZEND_THIS , true);
1247
+ if (EG (exception )) {
1248
+ RETURN_THROWS ();
1249
+ }
1237
1250
}
1238
1251
1239
1252
PHP_METHOD (SplHeap , __serialize )
@@ -1256,7 +1269,6 @@ PHP_METHOD(SplHeap, __unserialize)
1256
1269
{
1257
1270
HashTable * data ;
1258
1271
spl_heap_object * intern = Z_SPLHEAP_P (ZEND_THIS );
1259
- zval * props , * state ;
1260
1272
1261
1273
ZEND_PARSE_PARAMETERS_START (1 , 1 )
1262
1274
Z_PARAM_ARRAY_HT (data )
@@ -1267,7 +1279,7 @@ PHP_METHOD(SplHeap, __unserialize)
1267
1279
RETURN_THROWS ();
1268
1280
}
1269
1281
1270
- props = zend_hash_index_find (data , 0 );
1282
+ zval * props = zend_hash_index_find (data , 0 );
1271
1283
if (!props || Z_TYPE_P (props ) != IS_ARRAY ) {
1272
1284
zend_throw_exception_ex (NULL , 0 , "Invalid serialization data for %s object" , ZSTR_VAL (intern -> std .ce -> name ));
1273
1285
RETURN_THROWS ();
@@ -1278,13 +1290,16 @@ PHP_METHOD(SplHeap, __unserialize)
1278
1290
RETURN_THROWS ();
1279
1291
}
1280
1292
1281
- state = zend_hash_index_find (data , 1 );
1293
+ zval * state = zend_hash_index_find (data , 1 );
1282
1294
if (!state || Z_TYPE_P (state ) != IS_ARRAY ) {
1283
1295
zend_throw_exception_ex (NULL , 0 , "Invalid serialization data for %s object" , ZSTR_VAL (intern -> std .ce -> name ));
1284
1296
RETURN_THROWS ();
1285
1297
}
1286
1298
1287
1299
spl_heap_unserialize_internal_state (Z_ARRVAL_P (state ), intern , ZEND_THIS , false);
1300
+ if (EG (exception )) {
1301
+ RETURN_THROWS ();
1302
+ }
1288
1303
}
1289
1304
1290
1305
/* iterator handler table */
0 commit comments