|
35 | 35 | #define Z_OBJ_P(zval_p) \ |
36 | 36 | ((zend_object*)(EG(objects_store).object_buckets[Z_OBJ_HANDLE_P(zval_p)].bucket.obj.object)) |
37 | 37 |
|
| 38 | +#define Z_OBJ_PROTECT_RECURSION(zval_p) \ |
| 39 | + do { \ |
| 40 | + if (EG(objects_store).object_buckets[Z_OBJ_HANDLE_P(zval_p)].apply_count++ >= 3) { \ |
| 41 | + zend_error(E_ERROR, "Nesting level too deep - recursive dependency?"); \ |
| 42 | + } \ |
| 43 | + } while (0) |
| 44 | + |
| 45 | + |
| 46 | +#define Z_OBJ_UNPROTECT_RECURSION(zval_p) \ |
| 47 | + EG(objects_store).object_buckets[Z_OBJ_HANDLE_P(zval_p)].apply_count-- |
| 48 | + |
38 | 49 | /* |
39 | 50 | __X accessors explanation: |
40 | 51 |
|
@@ -1319,28 +1330,43 @@ static int zend_std_compare_objects(zval *o1, zval *o2 TSRMLS_DC) /* {{{ */ |
1319 | 1330 | } |
1320 | 1331 | if (!zobj1->properties && !zobj2->properties) { |
1321 | 1332 | int i; |
| 1333 | + |
| 1334 | + Z_OBJ_PROTECT_RECURSION(o1); |
| 1335 | + Z_OBJ_PROTECT_RECURSION(o2); |
1322 | 1336 | for (i = 0; i < zobj1->ce->default_properties_count; i++) { |
1323 | 1337 | if (zobj1->properties_table[i]) { |
1324 | 1338 | if (zobj2->properties_table[i]) { |
1325 | 1339 | zval result; |
1326 | 1340 |
|
1327 | 1341 | if (compare_function(&result, zobj1->properties_table[i], zobj2->properties_table[i] TSRMLS_CC)==FAILURE) { |
| 1342 | + Z_OBJ_UNPROTECT_RECURSION(o1); |
| 1343 | + Z_OBJ_UNPROTECT_RECURSION(o2); |
1328 | 1344 | return 1; |
1329 | 1345 | } |
1330 | 1346 | if (Z_LVAL(result) != 0) { |
| 1347 | + Z_OBJ_UNPROTECT_RECURSION(o1); |
| 1348 | + Z_OBJ_UNPROTECT_RECURSION(o2); |
1331 | 1349 | return Z_LVAL(result); |
1332 | 1350 | } |
1333 | 1351 | } else { |
| 1352 | + Z_OBJ_UNPROTECT_RECURSION(o1); |
| 1353 | + Z_OBJ_UNPROTECT_RECURSION(o2); |
1334 | 1354 | return 1; |
1335 | 1355 | } |
1336 | 1356 | } else { |
1337 | 1357 | if (zobj2->properties_table[i]) { |
| 1358 | + Z_OBJ_UNPROTECT_RECURSION(o1); |
| 1359 | + Z_OBJ_UNPROTECT_RECURSION(o2); |
1338 | 1360 | return 1; |
1339 | 1361 | } else { |
| 1362 | + Z_OBJ_UNPROTECT_RECURSION(o1); |
| 1363 | + Z_OBJ_UNPROTECT_RECURSION(o2); |
1340 | 1364 | return 0; |
1341 | 1365 | } |
1342 | 1366 | } |
1343 | 1367 | } |
| 1368 | + Z_OBJ_UNPROTECT_RECURSION(o1); |
| 1369 | + Z_OBJ_UNPROTECT_RECURSION(o2); |
1344 | 1370 | return 0; |
1345 | 1371 | } else { |
1346 | 1372 | if (!zobj1->properties) { |
|
0 commit comments