Skip to content

Commit ede92a8

Browse files
authored
Fix WeakMap object reference offset causing TypeError (#8995)
1 parent 789a37f commit ede92a8

File tree

2 files changed

+36
-0
lines changed

2 files changed

+36
-0
lines changed
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
--TEST--
2+
WeakMap object reference offset
3+
--FILE--
4+
<?php
5+
6+
$map = new WeakMap;
7+
$obj = new stdClass;
8+
$obj2 = &$obj;
9+
10+
$map[$obj] = 1;
11+
var_dump(count($map));
12+
var_dump($map);
13+
var_dump(isset($map[$obj]));
14+
var_dump(!empty($map[$obj]));
15+
var_dump($map[$obj]);
16+
17+
?>
18+
--EXPECT--
19+
int(1)
20+
object(WeakMap)#1 (1) {
21+
[0]=>
22+
array(2) {
23+
["key"]=>
24+
object(stdClass)#2 (0) {
25+
}
26+
["value"]=>
27+
int(1)
28+
}
29+
}
30+
bool(true)
31+
bool(true)
32+
int(1)

Zend/zend_weakrefs.c

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -310,6 +310,7 @@ static zval *zend_weakmap_read_dimension(zend_object *object, zval *offset, int
310310
return NULL;
311311
}
312312

313+
ZVAL_DEREF(offset);
313314
if (Z_TYPE_P(offset) != IS_OBJECT) {
314315
zend_type_error("WeakMap key must be an object");
315316
return NULL;
@@ -340,6 +341,7 @@ static void zend_weakmap_write_dimension(zend_object *object, zval *offset, zval
340341
return;
341342
}
342343

344+
ZVAL_DEREF(offset);
343345
if (Z_TYPE_P(offset) != IS_OBJECT) {
344346
zend_type_error("WeakMap key must be an object");
345347
return;
@@ -367,6 +369,7 @@ static void zend_weakmap_write_dimension(zend_object *object, zval *offset, zval
367369
/* int return and check_empty due to Object Handler API */
368370
static int zend_weakmap_has_dimension(zend_object *object, zval *offset, int check_empty)
369371
{
372+
ZVAL_DEREF(offset);
370373
if (Z_TYPE_P(offset) != IS_OBJECT) {
371374
zend_type_error("WeakMap key must be an object");
372375
return 0;
@@ -386,6 +389,7 @@ static int zend_weakmap_has_dimension(zend_object *object, zval *offset, int che
386389

387390
static void zend_weakmap_unset_dimension(zend_object *object, zval *offset)
388391
{
392+
ZVAL_DEREF(offset);
389393
if (Z_TYPE_P(offset) != IS_OBJECT) {
390394
zend_type_error("WeakMap key must be an object");
391395
return;

0 commit comments

Comments
 (0)