Skip to content

Commit 1ec9041

Browse files
authored
Fix reference handling in cancel callback (#18439)
Broke in 8765e9f
1 parent c919ab4 commit 1ec9041

File tree

2 files changed

+31
-2
lines changed

2 files changed

+31
-2
lines changed

ext/zip/php_zip.c

+4-2
Original file line numberDiff line numberDiff line change
@@ -3073,10 +3073,12 @@ static int php_zip_cancel_callback(zip_t *arch, void *ptr)
30733073
return -1;
30743074
}
30753075
bool failed = false;
3076-
zend_long retval = zval_try_get_long(&cb_retval, &failed);
3076+
zval *cb_retval_ptr = &cb_retval;
3077+
ZVAL_DEREF(cb_retval_ptr);
3078+
zend_long retval = zval_try_get_long(cb_retval_ptr, &failed);
30773079
if (failed) {
30783080
zend_type_error("Return value of callback provided to ZipArchive::registerCancelCallback()"
3079-
" must be of type int, %s returned", zend_zval_value_name(&cb_retval));
3081+
" must be of type int, %s returned", zend_zval_value_name(cb_retval_ptr));
30803082
zval_ptr_dtor(&cb_retval);
30813083
return -1;
30823084
}

ext/zip/tests/gh18439.phpt

+27
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
--TEST--
2+
GH-18439 (Reference handling in cancel callback)
3+
--EXTENSIONS--
4+
zip
5+
--FILE--
6+
<?php
7+
8+
function &cb() {
9+
$test = false;
10+
return $test;
11+
}
12+
13+
$file = __DIR__ . '/gh18439.zip';
14+
$zip = new ZipArchive;
15+
$zip->open($file, ZIPARCHIVE::CREATE);
16+
$zip->registerCancelCallback(cb(...));
17+
$zip->addFromString('test', 'test');
18+
echo "Done\n";
19+
20+
?>
21+
--CLEAN--
22+
<?php
23+
$file = __DIR__ . '/gh18439.zip';
24+
@unlink($file);
25+
?>
26+
--EXPECT--
27+
Done

0 commit comments

Comments
 (0)