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