@@ -1079,13 +1079,14 @@ static void spl_heap_serialize_properties(zval *return_value, spl_heap_object *i
1079
1079
{
1080
1080
HashTable * props = zend_std_get_properties (& intern -> std );
1081
1081
1082
- ZVAL_ARR (return_value , props ? zend_array_dup (props ) : zend_new_array (0 ));
1082
+ ZVAL_ARR (return_value , props );
1083
+ GC_ADDREF (props );
1083
1084
}
1084
1085
1085
1086
static void spl_heap_serialize_internal_state (zval * return_value , spl_heap_object * intern , bool is_pqueue )
1086
1087
{
1087
- zval heap_elements ;
1088
- int heap_count = intern -> heap -> count ;
1088
+ zval heap_elements ;
1089
+ int heap_count = intern -> heap -> count ;
1089
1090
1090
1091
array_init (return_value );
1091
1092
add_assoc_long (return_value , "flags" , intern -> flags );
@@ -1101,9 +1102,9 @@ static void spl_heap_serialize_internal_state(zval *return_value, spl_heap_objec
1101
1102
spl_pqueue_elem * elem = spl_heap_elem (intern -> heap , heap_idx );
1102
1103
zval entry ;
1103
1104
array_init (& entry );
1104
- add_assoc_zval_ex (& entry , "data" , sizeof ("data" ) - 1 , & elem -> data );
1105
+ add_assoc_zval_ex (& entry , "data" , strlen ("data" ), & elem -> data );
1105
1106
Z_TRY_ADDREF (elem -> data );
1106
- add_assoc_zval_ex (& entry , "priority" , sizeof ("priority" ) - 1 , & elem -> priority );
1107
+ add_assoc_zval_ex (& entry , "priority" , strlen ("priority" ), & elem -> priority );
1107
1108
Z_TRY_ADDREF (elem -> priority );
1108
1109
zend_hash_next_index_insert (Z_ARRVAL (heap_elements ), & entry );
1109
1110
} else {
@@ -1123,42 +1124,52 @@ static void spl_heap_unserialize_properties(HashTable *props_ht, spl_heap_object
1123
1124
return ;
1124
1125
}
1125
1126
1126
- zend_throw_exception_ex (NULL , 0 , "Invalid serialization data for %s object" , ZSTR_VAL (intern -> std .ce -> name ));
1127
+ zend_throw_exception_ex (NULL , 0 , "Invalid serialization data for %s object" , ZSTR_VAL (intern -> std .ce -> name ));
1127
1128
}
1128
1129
1129
1130
static void spl_heap_unserialize_internal_state (HashTable * state_ht , spl_heap_object * intern , zval * this_ptr , bool is_pqueue )
1130
1131
{
1131
- zval * flags_val = zend_hash_str_find (state_ht , "flags" , sizeof ("flags" ) - 1 );
1132
+ zval * flags_val = zend_hash_str_find (state_ht , "flags" , strlen ("flags" ));
1132
1133
if (!flags_val || Z_TYPE_P (flags_val ) != IS_LONG ) {
1133
- zend_throw_exception_ex (NULL , 0 , "Invalid serialization data for %s object: missing or invalid flags " , ZSTR_VAL (intern -> std .ce -> name ));
1134
+ zend_throw_exception_ex (NULL , 0 , "Invalid serialization data for %s object" , ZSTR_VAL (intern -> std .ce -> name ));
1134
1135
return ;
1135
1136
}
1136
1137
1137
- intern -> flags = ( int ) Z_LVAL_P (flags_val );
1138
+ zend_long flags_value = Z_LVAL_P (flags_val );
1138
1139
1139
- zval * heap_elements = zend_hash_str_find (state_ht , "heap_elements" , sizeof ("heap_elements" ) - 1 );
1140
+ if (is_pqueue ) {
1141
+ flags_value &= SPL_PQUEUE_EXTR_MASK ;
1142
+ if (!flags_value ) {
1143
+ zend_throw_exception_ex (NULL , 0 , "Invalid serialization data for %s object" , ZSTR_VAL (intern -> std .ce -> name ));
1144
+ return ;
1145
+ }
1146
+ }
1147
+
1148
+ intern -> flags = (int ) flags_value ;
1149
+
1150
+ zval * heap_elements = zend_hash_str_find (state_ht , "heap_elements" , strlen ("heap_elements" ));
1140
1151
if (!heap_elements ) {
1152
+ zend_throw_exception_ex (NULL , 0 , "Invalid serialization data for %s object" , ZSTR_VAL (intern -> std .ce -> name ));
1141
1153
return ;
1142
1154
}
1143
1155
1144
1156
if (Z_TYPE_P (heap_elements ) != IS_ARRAY ) {
1145
- zend_throw_exception_ex (NULL , 0 , "Invalid serialization data for %s object: heap_elements must be an array " , ZSTR_VAL (intern -> std .ce -> name ));
1157
+ zend_throw_exception_ex (NULL , 0 , "Invalid serialization data for %s object" , ZSTR_VAL (intern -> std .ce -> name ));
1146
1158
return ;
1147
1159
}
1148
1160
1149
- zval * val ;
1150
- ZEND_HASH_FOREACH_VAL (Z_ARRVAL_P (heap_elements ), val ) {
1161
+ ZEND_HASH_FOREACH_VAL (Z_ARRVAL_P (heap_elements ), zval * val ) {
1151
1162
if (is_pqueue ) {
1152
1163
if (Z_TYPE_P (val ) != IS_ARRAY ) {
1153
- zend_throw_exception_ex (NULL , 0 , "Invalid serialization data for %s object: priority queue elements must be arrays " , ZSTR_VAL (intern -> std .ce -> name ));
1164
+ zend_throw_exception_ex (NULL , 0 , "Invalid serialization data for %s object" , ZSTR_VAL (intern -> std .ce -> name ));
1154
1165
return ;
1155
1166
}
1156
1167
1157
- zval * data_val = zend_hash_str_find (Z_ARRVAL_P (val ), "data" , sizeof ("data" ) - 1 );
1158
- zval * priority_val = zend_hash_str_find (Z_ARRVAL_P (val ), "priority" , sizeof ("priority" ) - 1 );
1168
+ zval * data_val = zend_hash_str_find (Z_ARRVAL_P (val ), "data" , strlen ("data" ) );
1169
+ zval * priority_val = zend_hash_str_find (Z_ARRVAL_P (val ), "priority" , strlen ("priority" ));
1159
1170
1160
1171
if (!data_val || !priority_val ) {
1161
- 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 ));
1172
+ zend_throw_exception_ex (NULL , 0 , "Invalid serialization data for %s object" , ZSTR_VAL (intern -> std .ce -> name ));
1162
1173
return ;
1163
1174
}
1164
1175
@@ -1193,7 +1204,6 @@ PHP_METHOD(SplPriorityQueue, __unserialize)
1193
1204
{
1194
1205
HashTable * data ;
1195
1206
spl_heap_object * intern = Z_SPLHEAP_P (ZEND_THIS );
1196
- zval * props , * state ;
1197
1207
1198
1208
ZEND_PARSE_PARAMETERS_START (1 , 1 )
1199
1209
Z_PARAM_ARRAY_HT (data )
@@ -1204,7 +1214,7 @@ PHP_METHOD(SplPriorityQueue, __unserialize)
1204
1214
RETURN_THROWS ();
1205
1215
}
1206
1216
1207
- props = zend_hash_index_find (data , 0 );
1217
+ zval * props = zend_hash_index_find (data , 0 );
1208
1218
if (!props || Z_TYPE_P (props ) != IS_ARRAY ) {
1209
1219
zend_throw_exception_ex (NULL , 0 , "Invalid serialization data for %s object" , ZSTR_VAL (intern -> std .ce -> name ));
1210
1220
RETURN_THROWS ();
@@ -1215,13 +1225,16 @@ PHP_METHOD(SplPriorityQueue, __unserialize)
1215
1225
RETURN_THROWS ();
1216
1226
}
1217
1227
1218
- state = zend_hash_index_find (data , 1 );
1228
+ zval * state = zend_hash_index_find (data , 1 );
1219
1229
if (!state || Z_TYPE_P (state ) != IS_ARRAY ) {
1220
1230
zend_throw_exception_ex (NULL , 0 , "Invalid serialization data for %s object" , ZSTR_VAL (intern -> std .ce -> name ));
1221
1231
RETURN_THROWS ();
1222
1232
}
1223
1233
1224
1234
spl_heap_unserialize_internal_state (Z_ARRVAL_P (state ), intern , ZEND_THIS , true);
1235
+ if (EG (exception )) {
1236
+ RETURN_THROWS ();
1237
+ }
1225
1238
}
1226
1239
1227
1240
PHP_METHOD (SplHeap , __serialize )
@@ -1244,7 +1257,6 @@ PHP_METHOD(SplHeap, __unserialize)
1244
1257
{
1245
1258
HashTable * data ;
1246
1259
spl_heap_object * intern = Z_SPLHEAP_P (ZEND_THIS );
1247
- zval * props , * state ;
1248
1260
1249
1261
ZEND_PARSE_PARAMETERS_START (1 , 1 )
1250
1262
Z_PARAM_ARRAY_HT (data )
@@ -1255,7 +1267,7 @@ PHP_METHOD(SplHeap, __unserialize)
1255
1267
RETURN_THROWS ();
1256
1268
}
1257
1269
1258
- props = zend_hash_index_find (data , 0 );
1270
+ zval * props = zend_hash_index_find (data , 0 );
1259
1271
if (!props || Z_TYPE_P (props ) != IS_ARRAY ) {
1260
1272
zend_throw_exception_ex (NULL , 0 , "Invalid serialization data for %s object" , ZSTR_VAL (intern -> std .ce -> name ));
1261
1273
RETURN_THROWS ();
@@ -1266,13 +1278,16 @@ PHP_METHOD(SplHeap, __unserialize)
1266
1278
RETURN_THROWS ();
1267
1279
}
1268
1280
1269
- state = zend_hash_index_find (data , 1 );
1281
+ zval * state = zend_hash_index_find (data , 1 );
1270
1282
if (!state || Z_TYPE_P (state ) != IS_ARRAY ) {
1271
1283
zend_throw_exception_ex (NULL , 0 , "Invalid serialization data for %s object" , ZSTR_VAL (intern -> std .ce -> name ));
1272
1284
RETURN_THROWS ();
1273
1285
}
1274
1286
1275
1287
spl_heap_unserialize_internal_state (Z_ARRVAL_P (state ), intern , ZEND_THIS , false);
1288
+ if (EG (exception )) {
1289
+ RETURN_THROWS ();
1290
+ }
1276
1291
}
1277
1292
1278
1293
/* iterator handler table */
0 commit comments