File tree Expand file tree Collapse file tree 3 files changed +38
-0
lines changed Expand file tree Collapse file tree 3 files changed +38
-0
lines changed Original file line number Diff line number Diff line change @@ -22,6 +22,8 @@ PHP NEWS
22
22
. Fixed bug GH-19326 (Calling Generator::throw() on a running generator with
23
23
a non-Generator delegate crashes). (Arnaud)
24
24
. Fixed bug GH-19280 (Stale array iterator position on rehashing). (ilutov)
25
+ . Fixed bug GH-18736 (Circumvented type check with return by ref + finally).
26
+ (ilutov)
25
27
26
28
- FTP:
27
29
. Fix theoretical issues with hrtime() not being available. (nielsdos)
Original file line number Diff line number Diff line change
1
+ --TEST--
2
+ GH-18736: Circumvented type check with return by ref + finally
3
+ --FILE--
4
+ <?php
5
+
6
+ function &test (): int {
7
+ $ x = 0 ;
8
+ try {
9
+ return $ x ;
10
+ } finally {
11
+ $ x = 'test ' ;
12
+ }
13
+ }
14
+
15
+ try {
16
+ $ x = &test ();
17
+ var_dump ($ x );
18
+ } catch (Error $ e ) {
19
+ echo $ e ->getMessage (), "\n" ;
20
+ }
21
+
22
+ ?>
23
+ --EXPECT--
24
+ test(): Return value must be of type int, string returned
Original file line number Diff line number Diff line change @@ -5725,8 +5725,20 @@ static void zend_compile_return(zend_ast *ast) /* {{{ */
5725
5725
expr_ast ? & expr_node : NULL , CG (active_op_array )-> arg_info - 1 , 0 );
5726
5726
}
5727
5727
5728
+ uint32_t opnum_before_finally = get_next_op_number ();
5729
+
5728
5730
zend_handle_loops_and_finally ((expr_node .op_type & (IS_TMP_VAR | IS_VAR )) ? & expr_node : NULL );
5729
5731
5732
+ /* Content of reference might have changed in finally, repeat type check. */
5733
+ if (by_ref
5734
+ /* Check if any opcodes were emitted since the last return type check. */
5735
+ && opnum_before_finally != get_next_op_number ()
5736
+ && !is_generator
5737
+ && (CG (active_op_array )-> fn_flags & ZEND_ACC_HAS_RETURN_TYPE )) {
5738
+ zend_emit_return_type_check (
5739
+ expr_ast ? & expr_node : NULL , CG (active_op_array )-> arg_info - 1 , 0 );
5740
+ }
5741
+
5730
5742
opline = zend_emit_op (NULL , by_ref ? ZEND_RETURN_BY_REF : ZEND_RETURN ,
5731
5743
& expr_node , NULL );
5732
5744
You can’t perform that action at this time.
0 commit comments