]> granicus.if.org Git - php/commitdiff
Merge branch 'PHP-7.3' into PHP-7.4
authorDmitry Stogov <dmitry@zend.com>
Thu, 19 Dec 2019 20:17:39 +0000 (23:17 +0300)
committerDmitry Stogov <dmitry@zend.com>
Thu, 19 Dec 2019 20:17:39 +0000 (23:17 +0300)
* PHP-7.3:
  Fixed bug #78999 (Cycle leak when using function result as temporary)

1  2 
NEWS
Zend/zend_vm_def.h
Zend/zend_vm_execute.h

diff --cc NEWS
index f88f6e67dfdaaedeb0e89bc3473ce4e2e7b63e16,60e91f19df1e76c0e19b178b32c64f311cc96da8..47e4e05b6a93690e122885ec4493fda2166ea9da
--- 1/NEWS
--- 2/NEWS
+++ b/NEWS
@@@ -1,23 -1,17 +1,25 @@@
  PHP                                                                        NEWS
  |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
 -?? ??? ????, PHP 7.3.14
  
 -- Core
 +?? ??? ????, PHP 7.4.2
 +
 +- Core:
 +  . Fixed bug #78929 (plus signs in cookie values are converted to spaces).
 +    (Alexey Kachalin)
 +  . Fixed bug #78973 (Destructor during CV freeing causes segfault if opline
 +    never saved). (Nikita)
 +  . Fixed bug #78776 (Abstract method implementation from trait does not check
 +    "static"). (Nikita)
+   . Fixed bug #78999 (Cycle leak when using function result as temporary).
+     (Dmitry)
  
 -- CURL:
 -  . Implemented FR #77711 (CURLFile should support UNICODE filenames). (cmb)
 -
 -- GD:
 -  . Fixed bug #78923 (Artifacts when convoluting image with transparency).
 -    (wilson chen)
 +- OPcache:
 +  . Fixed bug #78961 (erroneous optimization of re-assigned $GLOBALS). (Dmitry)
 +  . Fixed bug #78950 (Preloading trait method with static variables). (Nikita)
 +  . Fixed bug #78903 (Conflict in RTD key for closures results in crash).
 +    (Nikita)
 +  . Fixed bug #78986 (Opcache segfaults when inheriting ctor from immutable
 +    into mutable class). (Nikita)
  
  - PDO_PgSQL:
    . Fixed bug #78983 (pdo_pgsql config.w32 cannot find libpq-fe.h). (SATŌ
index d041d168938c120ac5c050e9c22606d809189d94,62a9ad8bed8178c3020915a8234db68b5c8bbaf5..66a4c6be31214a4fbcea05b83cb6402807aeac05
@@@ -4324,25 -3856,25 +4324,29 @@@ ZEND_VM_INLINE_HANDLER(62, ZEND_RETURN
                                }
                        }
                } else if (OP1_TYPE == IS_CV) {
 -                      if (Z_OPT_REFCOUNTED_P(retval_ptr)) {
 -                              if (EXPECTED(!Z_OPT_ISREF_P(retval_ptr))) {
 -                                      ZVAL_COPY_VALUE(return_value, retval_ptr);
 -                                      if (EXPECTED(!(EX_CALL_INFO() & ZEND_CALL_CODE))) {
 -                                              zend_refcounted *ref = Z_COUNTED_P(retval_ptr);
 -                                              if (GC_MAY_LEAK(ref)) {
 -                                                      gc_possible_root(ref);
 +                      do {
 +                              if (Z_OPT_REFCOUNTED_P(retval_ptr)) {
 +                                      if (EXPECTED(!Z_OPT_ISREF_P(retval_ptr))) {
 +                                              if (EXPECTED(!(EX_CALL_INFO() & ZEND_CALL_CODE))) {
++                                                      zend_refcounted *ref = Z_COUNTED_P(retval_ptr);
 +                                                      ZVAL_COPY_VALUE(return_value, retval_ptr);
++                                                      if (GC_MAY_LEAK(ref)) {
++                                                              gc_possible_root(ref);
++                                                      }
 +                                                      ZVAL_NULL(retval_ptr);
 +                                                      break;
 +                                              } else {
 +                                                      Z_ADDREF_P(retval_ptr);
                                                }
 -                                              ZVAL_NULL(retval_ptr);
                                        } else {
 -                                              Z_ADDREF_P(return_value);
 +                                              retval_ptr = Z_REFVAL_P(retval_ptr);
 +                                              if (Z_OPT_REFCOUNTED_P(retval_ptr)) {
 +                                                      Z_ADDREF_P(retval_ptr);
 +                                              }
                                        }
 -                              } else {
 -                                      retval_ptr = Z_REFVAL_P(retval_ptr);
 -                                      ZVAL_COPY(return_value, retval_ptr);
                                }
 -                      } else {
                                ZVAL_COPY_VALUE(return_value, retval_ptr);
 -                      }
 +                      } while (0);
                } else /* if (OP1_TYPE == IS_VAR) */ {
                        if (UNEXPECTED(Z_ISREF_P(retval_ptr))) {
                                zend_refcounted *ref = Z_COUNTED_P(retval_ptr);
index b015558084b9e3d91d924a562c5a78c2bf2cc8b9,e893e35b6d53f4b51875e02d53ae969b88b2a254..f5346d0d57dec556039b6792de005ff7649ca05a
@@@ -3519,25 -2723,25 +3519,29 @@@ static ZEND_VM_HOT ZEND_OPCODE_HANDLER_
                                }
                        }
                } else if (IS_CONST == IS_CV) {
 -                      if (Z_OPT_REFCOUNTED_P(retval_ptr)) {
 -                              if (EXPECTED(!Z_OPT_ISREF_P(retval_ptr))) {
 -                                      ZVAL_COPY_VALUE(return_value, retval_ptr);
 -                                      if (EXPECTED(!(EX_CALL_INFO() & ZEND_CALL_CODE))) {
 -                                              zend_refcounted *ref = Z_COUNTED_P(retval_ptr);
 -                                              if (GC_MAY_LEAK(ref)) {
 -                                                      gc_possible_root(ref);
 +                      do {
 +                              if (Z_OPT_REFCOUNTED_P(retval_ptr)) {
 +                                      if (EXPECTED(!Z_OPT_ISREF_P(retval_ptr))) {
 +                                              if (EXPECTED(!(EX_CALL_INFO() & ZEND_CALL_CODE))) {
++                                                      zend_refcounted *ref = Z_COUNTED_P(retval_ptr);
 +                                                      ZVAL_COPY_VALUE(return_value, retval_ptr);
++                                                      if (GC_MAY_LEAK(ref)) {
++                                                              gc_possible_root(ref);
++                                                      }
 +                                                      ZVAL_NULL(retval_ptr);
 +                                                      break;
 +                                              } else {
 +                                                      Z_ADDREF_P(retval_ptr);
                                                }
 -                                              ZVAL_NULL(retval_ptr);
                                        } else {
 -                                              Z_ADDREF_P(return_value);
 +                                              retval_ptr = Z_REFVAL_P(retval_ptr);
 +                                              if (Z_OPT_REFCOUNTED_P(retval_ptr)) {
 +                                                      Z_ADDREF_P(retval_ptr);
 +                                              }
                                        }
 -                              } else {
 -                                      retval_ptr = Z_REFVAL_P(retval_ptr);
 -                                      ZVAL_COPY(return_value, retval_ptr);
                                }
 -                      } else {
                                ZVAL_COPY_VALUE(return_value, retval_ptr);
 -                      }
 +                      } while (0);
                } else /* if (IS_CONST == IS_VAR) */ {
                        if (UNEXPECTED(Z_ISREF_P(retval_ptr))) {
                                zend_refcounted *ref = Z_COUNTED_P(retval_ptr);
@@@ -17794,25 -17665,25 +17798,29 @@@ static ZEND_VM_HOT ZEND_OPCODE_HANDLER_
                                }
                        }
                } else if (IS_TMP_VAR == IS_CV) {
 -                      if (Z_OPT_REFCOUNTED_P(retval_ptr)) {
 -                              if (EXPECTED(!Z_OPT_ISREF_P(retval_ptr))) {
 -                                      ZVAL_COPY_VALUE(return_value, retval_ptr);
 -                                      if (EXPECTED(!(EX_CALL_INFO() & ZEND_CALL_CODE))) {
 -                                              zend_refcounted *ref = Z_COUNTED_P(retval_ptr);
 -                                              if (GC_MAY_LEAK(ref)) {
 -                                                      gc_possible_root(ref);
 +                      do {
 +                              if (Z_OPT_REFCOUNTED_P(retval_ptr)) {
 +                                      if (EXPECTED(!Z_OPT_ISREF_P(retval_ptr))) {
 +                                              if (EXPECTED(!(EX_CALL_INFO() & ZEND_CALL_CODE))) {
++                                                      zend_refcounted *ref = Z_COUNTED_P(retval_ptr);
 +                                                      ZVAL_COPY_VALUE(return_value, retval_ptr);
++                                                      if (GC_MAY_LEAK(ref)) {
++                                                              gc_possible_root(ref);
++                                                      }
 +                                                      ZVAL_NULL(retval_ptr);
 +                                                      break;
 +                                              } else {
 +                                                      Z_ADDREF_P(retval_ptr);
                                                }
 -                                              ZVAL_NULL(retval_ptr);
                                        } else {
 -                                              Z_ADDREF_P(return_value);
 +                                              retval_ptr = Z_REFVAL_P(retval_ptr);
 +                                              if (Z_OPT_REFCOUNTED_P(retval_ptr)) {
 +                                                      Z_ADDREF_P(retval_ptr);
 +                                              }
                                        }
 -                              } else {
 -                                      retval_ptr = Z_REFVAL_P(retval_ptr);
 -                                      ZVAL_COPY(return_value, retval_ptr);
                                }
 -                      } else {
                                ZVAL_COPY_VALUE(return_value, retval_ptr);
 -                      }
 +                      } while (0);
                } else /* if (IS_TMP_VAR == IS_VAR) */ {
                        if (UNEXPECTED(Z_ISREF_P(retval_ptr))) {
                                zend_refcounted *ref = Z_COUNTED_P(retval_ptr);
@@@ -20630,25 -20437,25 +20638,29 @@@ static ZEND_VM_HOT ZEND_OPCODE_HANDLER_
                                }
                        }
                } else if (IS_VAR == IS_CV) {
 -                      if (Z_OPT_REFCOUNTED_P(retval_ptr)) {
 -                              if (EXPECTED(!Z_OPT_ISREF_P(retval_ptr))) {
 -                                      ZVAL_COPY_VALUE(return_value, retval_ptr);
 -                                      if (EXPECTED(!(EX_CALL_INFO() & ZEND_CALL_CODE))) {
 -                                              zend_refcounted *ref = Z_COUNTED_P(retval_ptr);
 -                                              if (GC_MAY_LEAK(ref)) {
 -                                                      gc_possible_root(ref);
 +                      do {
 +                              if (Z_OPT_REFCOUNTED_P(retval_ptr)) {
 +                                      if (EXPECTED(!Z_OPT_ISREF_P(retval_ptr))) {
 +                                              if (EXPECTED(!(EX_CALL_INFO() & ZEND_CALL_CODE))) {
++                                                      zend_refcounted *ref = Z_COUNTED_P(retval_ptr);
 +                                                      ZVAL_COPY_VALUE(return_value, retval_ptr);
++                                                      if (GC_MAY_LEAK(ref)) {
++                                                              gc_possible_root(ref);
++                                                      }
 +                                                      ZVAL_NULL(retval_ptr);
 +                                                      break;
 +                                              } else {
 +                                                      Z_ADDREF_P(retval_ptr);
                                                }
 -                                              ZVAL_NULL(retval_ptr);
                                        } else {
 -                                              Z_ADDREF_P(return_value);
 +                                              retval_ptr = Z_REFVAL_P(retval_ptr);
 +                                              if (Z_OPT_REFCOUNTED_P(retval_ptr)) {
 +                                                      Z_ADDREF_P(retval_ptr);
 +                                              }
                                        }
 -                              } else {
 -                                      retval_ptr = Z_REFVAL_P(retval_ptr);
 -                                      ZVAL_COPY(return_value, retval_ptr);
                                }
 -                      } else {
                                ZVAL_COPY_VALUE(return_value, retval_ptr);
 -                      }
 +                      } while (0);
                } else /* if (IS_VAR == IS_VAR) */ {
                        if (UNEXPECTED(Z_ISREF_P(retval_ptr))) {
                                zend_refcounted *ref = Z_COUNTED_P(retval_ptr);
@@@ -36997,25 -36883,25 +37009,29 @@@ static ZEND_VM_HOT ZEND_OPCODE_HANDLER_
                                }
                        }
                } else if (IS_CV == IS_CV) {
 -                      if (Z_OPT_REFCOUNTED_P(retval_ptr)) {
 -                              if (EXPECTED(!Z_OPT_ISREF_P(retval_ptr))) {
 -                                      ZVAL_COPY_VALUE(return_value, retval_ptr);
 -                                      if (EXPECTED(!(EX_CALL_INFO() & ZEND_CALL_CODE))) {
 -                                              zend_refcounted *ref = Z_COUNTED_P(retval_ptr);
 -                                              if (GC_MAY_LEAK(ref)) {
 -                                                      gc_possible_root(ref);
 +                      do {
 +                              if (Z_OPT_REFCOUNTED_P(retval_ptr)) {
 +                                      if (EXPECTED(!Z_OPT_ISREF_P(retval_ptr))) {
 +                                              if (EXPECTED(!(EX_CALL_INFO() & ZEND_CALL_CODE))) {
++                                                      zend_refcounted *ref = Z_COUNTED_P(retval_ptr);
 +                                                      ZVAL_COPY_VALUE(return_value, retval_ptr);
++                                                      if (GC_MAY_LEAK(ref)) {
++                                                              gc_possible_root(ref);
++                                                      }
 +                                                      ZVAL_NULL(retval_ptr);
 +                                                      break;
 +                                              } else {
 +                                                      Z_ADDREF_P(retval_ptr);
                                                }
 -                                              ZVAL_NULL(retval_ptr);
                                        } else {
 -                                              Z_ADDREF_P(return_value);
 +                                              retval_ptr = Z_REFVAL_P(retval_ptr);
 +                                              if (Z_OPT_REFCOUNTED_P(retval_ptr)) {
 +                                                      Z_ADDREF_P(retval_ptr);
 +                                              }
                                        }
 -                              } else {
 -                                      retval_ptr = Z_REFVAL_P(retval_ptr);
 -                                      ZVAL_COPY(return_value, retval_ptr);
                                }
 -                      } else {
                                ZVAL_COPY_VALUE(return_value, retval_ptr);
 -                      }
 +                      } while (0);
                } else /* if (IS_CV == IS_VAR) */ {
                        if (UNEXPECTED(Z_ISREF_P(retval_ptr))) {
                                zend_refcounted *ref = Z_COUNTED_P(retval_ptr);
@@@ -53784,25 -55726,25 +53800,29 @@@ zend_leave_helper_SPEC_LABEL
                                }
                        }
                } else if (IS_CONST == IS_CV) {
 -                      if (Z_OPT_REFCOUNTED_P(retval_ptr)) {
 -                              if (EXPECTED(!Z_OPT_ISREF_P(retval_ptr))) {
 -                                      ZVAL_COPY_VALUE(return_value, retval_ptr);
 -                                      if (EXPECTED(!(EX_CALL_INFO() & ZEND_CALL_CODE))) {
 -                                              zend_refcounted *ref = Z_COUNTED_P(retval_ptr);
 -                                              if (GC_MAY_LEAK(ref)) {
 -                                                      gc_possible_root(ref);
 +                      do {
 +                              if (Z_OPT_REFCOUNTED_P(retval_ptr)) {
 +                                      if (EXPECTED(!Z_OPT_ISREF_P(retval_ptr))) {
 +                                              if (EXPECTED(!(EX_CALL_INFO() & ZEND_CALL_CODE))) {
++                                                      zend_refcounted *ref = Z_COUNTED_P(retval_ptr);
 +                                                      ZVAL_COPY_VALUE(return_value, retval_ptr);
++                                                      if (GC_MAY_LEAK(ref)) {
++                                                              gc_possible_root(ref);
++                                                      }
 +                                                      ZVAL_NULL(retval_ptr);
 +                                                      break;
 +                                              } else {
 +                                                      Z_ADDREF_P(retval_ptr);
                                                }
 -                                              ZVAL_NULL(retval_ptr);
                                        } else {
 -                                              Z_ADDREF_P(return_value);
 +                                              retval_ptr = Z_REFVAL_P(retval_ptr);
 +                                              if (Z_OPT_REFCOUNTED_P(retval_ptr)) {
 +                                                      Z_ADDREF_P(retval_ptr);
 +                                              }
                                        }
 -                              } else {
 -                                      retval_ptr = Z_REFVAL_P(retval_ptr);
 -                                      ZVAL_COPY(return_value, retval_ptr);
                                }
 -                      } else {
                                ZVAL_COPY_VALUE(return_value, retval_ptr);
 -                      }
 +                      } while (0);
                } else /* if (IS_CONST == IS_VAR) */ {
                        if (UNEXPECTED(Z_ISREF_P(retval_ptr))) {
                                zend_refcounted *ref = Z_COUNTED_P(retval_ptr);
                                }
                        }
                } else if (IS_TMP_VAR == IS_CV) {
 -                      if (Z_OPT_REFCOUNTED_P(retval_ptr)) {
 -                              if (EXPECTED(!Z_OPT_ISREF_P(retval_ptr))) {
 -                                      ZVAL_COPY_VALUE(return_value, retval_ptr);
 -                                      if (EXPECTED(!(EX_CALL_INFO() & ZEND_CALL_CODE))) {
 -                                              zend_refcounted *ref = Z_COUNTED_P(retval_ptr);
 -                                              if (GC_MAY_LEAK(ref)) {
 -                                                      gc_possible_root(ref);
 +                      do {
 +                              if (Z_OPT_REFCOUNTED_P(retval_ptr)) {
 +                                      if (EXPECTED(!Z_OPT_ISREF_P(retval_ptr))) {
 +                                              if (EXPECTED(!(EX_CALL_INFO() & ZEND_CALL_CODE))) {
++                                                      zend_refcounted *ref = Z_COUNTED_P(retval_ptr);
 +                                                      ZVAL_COPY_VALUE(return_value, retval_ptr);
++                                                      if (GC_MAY_LEAK(ref)) {
++                                                              gc_possible_root(ref);
++                                                      }
 +                                                      ZVAL_NULL(retval_ptr);
 +                                                      break;
 +                                              } else {
 +                                                      Z_ADDREF_P(retval_ptr);
                                                }
 -                                              ZVAL_NULL(retval_ptr);
                                        } else {
 -                                              Z_ADDREF_P(return_value);
 +                                              retval_ptr = Z_REFVAL_P(retval_ptr);
 +                                              if (Z_OPT_REFCOUNTED_P(retval_ptr)) {
 +                                                      Z_ADDREF_P(retval_ptr);
 +                                              }
                                        }
 -                              } else {
 -                                      retval_ptr = Z_REFVAL_P(retval_ptr);
 -                                      ZVAL_COPY(return_value, retval_ptr);
                                }
 -                      } else {
                                ZVAL_COPY_VALUE(return_value, retval_ptr);
 -                      }
 +                      } while (0);
                } else /* if (IS_TMP_VAR == IS_VAR) */ {
                        if (UNEXPECTED(Z_ISREF_P(retval_ptr))) {
                                zend_refcounted *ref = Z_COUNTED_P(retval_ptr);
                                }
                        }
                } else if (IS_VAR == IS_CV) {
 -                      if (Z_OPT_REFCOUNTED_P(retval_ptr)) {
 -                              if (EXPECTED(!Z_OPT_ISREF_P(retval_ptr))) {
 -                                      ZVAL_COPY_VALUE(return_value, retval_ptr);
 -                                      if (EXPECTED(!(EX_CALL_INFO() & ZEND_CALL_CODE))) {
 -                                              zend_refcounted *ref = Z_COUNTED_P(retval_ptr);
 -                                              if (GC_MAY_LEAK(ref)) {
 -                                                      gc_possible_root(ref);
 +                      do {
 +                              if (Z_OPT_REFCOUNTED_P(retval_ptr)) {
 +                                      if (EXPECTED(!Z_OPT_ISREF_P(retval_ptr))) {
 +                                              if (EXPECTED(!(EX_CALL_INFO() & ZEND_CALL_CODE))) {
++                                                      zend_refcounted *ref = Z_COUNTED_P(retval_ptr);
 +                                                      ZVAL_COPY_VALUE(return_value, retval_ptr);
++                                                      if (GC_MAY_LEAK(ref)) {
++                                                              gc_possible_root(ref);
++                                                      }
 +                                                      ZVAL_NULL(retval_ptr);
 +                                                      break;
 +                                              } else {
 +                                                      Z_ADDREF_P(retval_ptr);
                                                }
 -                                              ZVAL_NULL(retval_ptr);
                                        } else {
 -                                              Z_ADDREF_P(return_value);
 +                                              retval_ptr = Z_REFVAL_P(retval_ptr);
 +                                              if (Z_OPT_REFCOUNTED_P(retval_ptr)) {
 +                                                      Z_ADDREF_P(retval_ptr);
 +                                              }
                                        }
 -                              } else {
 -                                      retval_ptr = Z_REFVAL_P(retval_ptr);
 -                                      ZVAL_COPY(return_value, retval_ptr);
                                }
 -                      } else {
                                ZVAL_COPY_VALUE(return_value, retval_ptr);
 -                      }
 +                      } while (0);
                } else /* if (IS_VAR == IS_VAR) */ {
                        if (UNEXPECTED(Z_ISREF_P(retval_ptr))) {
                                zend_refcounted *ref = Z_COUNTED_P(retval_ptr);
                                }
                        }
                } else if (IS_CV == IS_CV) {
 -                      if (Z_OPT_REFCOUNTED_P(retval_ptr)) {
 -                              if (EXPECTED(!Z_OPT_ISREF_P(retval_ptr))) {
 -                                      ZVAL_COPY_VALUE(return_value, retval_ptr);
 -                                      if (EXPECTED(!(EX_CALL_INFO() & ZEND_CALL_CODE))) {
 -                                              zend_refcounted *ref = Z_COUNTED_P(retval_ptr);
 -                                              if (GC_MAY_LEAK(ref)) {
 -                                                      gc_possible_root(ref);
 +                      do {
 +                              if (Z_OPT_REFCOUNTED_P(retval_ptr)) {
 +                                      if (EXPECTED(!Z_OPT_ISREF_P(retval_ptr))) {
 +                                              if (EXPECTED(!(EX_CALL_INFO() & ZEND_CALL_CODE))) {
++                                                      zend_refcounted *ref = Z_COUNTED_P(retval_ptr);
 +                                                      ZVAL_COPY_VALUE(return_value, retval_ptr);
++                                                      if (GC_MAY_LEAK(ref)) {
++                                                              gc_possible_root(ref);
++                                                      }
 +                                                      ZVAL_NULL(retval_ptr);
 +                                                      break;
 +                                              } else {
 +                                                      Z_ADDREF_P(retval_ptr);
                                                }
 -                                              ZVAL_NULL(retval_ptr);
                                        } else {
 -                                              Z_ADDREF_P(return_value);
 +                                              retval_ptr = Z_REFVAL_P(retval_ptr);
 +                                              if (Z_OPT_REFCOUNTED_P(retval_ptr)) {
 +                                                      Z_ADDREF_P(retval_ptr);
 +                                              }
                                        }
 -                              } else {
 -                                      retval_ptr = Z_REFVAL_P(retval_ptr);
 -                                      ZVAL_COPY(return_value, retval_ptr);
                                }
 -                      } else {
                                ZVAL_COPY_VALUE(return_value, retval_ptr);
 -                      }
 +                      } while (0);
                } else /* if (IS_CV == IS_VAR) */ {
                        if (UNEXPECTED(Z_ISREF_P(retval_ptr))) {
                                zend_refcounted *ref = Z_COUNTED_P(retval_ptr);