Skip to content

Commit 4552941

Browse files
committed
Merge branch 'PHP-8.1'
* PHP-8.1: [ci skip] NEWS Fix `WeakMap` object reference offset causing `TypeError` (#8995)
2 parents 63912b5 + aadb24e commit 4552941

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
@@ -332,6 +332,7 @@ static zval *zend_weakmap_read_dimension(zend_object *object, zval *offset, int
332332
return NULL;
333333
}
334334

335+
ZVAL_DEREF(offset);
335336
if (Z_TYPE_P(offset) != IS_OBJECT) {
336337
zend_type_error("WeakMap key must be an object");
337338
return NULL;
@@ -362,6 +363,7 @@ static void zend_weakmap_write_dimension(zend_object *object, zval *offset, zval
362363
return;
363364
}
364365

366+
ZVAL_DEREF(offset);
365367
if (Z_TYPE_P(offset) != IS_OBJECT) {
366368
zend_type_error("WeakMap key must be an object");
367369
return;
@@ -390,6 +392,7 @@ static void zend_weakmap_write_dimension(zend_object *object, zval *offset, zval
390392
/* int return and check_empty due to Object Handler API */
391393
static int zend_weakmap_has_dimension(zend_object *object, zval *offset, int check_empty)
392394
{
395+
ZVAL_DEREF(offset);
393396
if (Z_TYPE_P(offset) != IS_OBJECT) {
394397
zend_type_error("WeakMap key must be an object");
395398
return 0;
@@ -409,6 +412,7 @@ static int zend_weakmap_has_dimension(zend_object *object, zval *offset, int che
409412

410413
static void zend_weakmap_unset_dimension(zend_object *object, zval *offset)
411414
{
415+
ZVAL_DEREF(offset);
412416
if (Z_TYPE_P(offset) != IS_OBJECT) {
413417
zend_type_error("WeakMap key must be an object");
414418
return;

0 commit comments

Comments
 (0)