617 Commits
Author SHA1 Message Date
Ilija Tovilo 9705fda1bb Merge branch 'PHP-8.6' into master
* PHP-8.6:
  Add NEWS entry
  Avoid state corruption via bailout
2026-10-21 16:34:56 +02:00
Ilija Tovilo d6373dfe15 Merge branch 'PHP-8.5' into PHP-8.6
* PHP-8.5:
  Add NEWS entry
  Avoid state corruption via bailout
2026-10-21 16:33:23 +02:00
Ilija Tovilo c7273b9ba8 Merge branch 'PHP-8.4' into PHP-8.5
* PHP-8.4:
  Add NEWS entry
  Avoid state corruption via bailout
2026-10-21 16:30:04 +02:00
Ilija Tovilo 8a94bb3822 Merge branch 'PHP-8.3' into PHP-8.4
* PHP-8.3:
  Add NEWS entry
  Avoid state corruption via bailout
2026-10-21 16:27:03 +02:00
Ilija Tovilo c1a5f468d0 Merge branch 'PHP-8.2' into PHP-8.3
* PHP-8.2:
  Add NEWS entry
  Avoid state corruption via bailout
2026-10-21 16:12:35 +02:00
3584a98bda Avoid state corruption via bailout
- Replace bailout on OOM with UnwindExit
- Properly reset various globals that may be accessed during startup

Fix GHSA-w8hw-w9fx-j79w (CVE-2026-109618)
Fix GHSA-6wmf-4rv5-p3rp (CVE-2026-109619)

Co-authored-by: Ilija Tovilo <ilija.tovilo@me.com>
Co-authored-by: Jakub Zelenka <bukka@php.net>
Co-authored-by: Nora Dossche <7771979+ndossche@users.noreply.github.com>
Co-authored-by: Nicolas Grekas <nicolas.grekas@gmail.com>
2026-10-21 16:06:22 +02:00
Kamil Tekiela 4ab0ffb5d1 Zend: Remove returns after zend_error_noreturn (#23285) 2026-10-01 17:53:54 +01:00
Dmytro Kulyk 67135cb97b gen_stub: Conditionally include zend_attributes.h to arginfo based on usage (#21570)
Headers required by the generated code (zend_attributes.h, zend_constants.h, zend_enum.h) are collected during generation and emitted as includes at the top of the arginfo file, with the same preprocessor conditions and PHP version guards as the code that needs them.

Removes the manual zend_attributes.h and zend_enum.h includes from sources that only needed them for the arginfo file they include.
2026-09-06 21:25:20 +02:00
NickSdot 60adb50347 ext/json: applied fixers to improve test robustness (#23029) 2026-08-22 14:16:47 +01:00
Ilia Alshanetsky 4a42b033c2 Merge branch 'PHP-8.5'
* PHP-8.5:
  Free the hooked property value when json_encode() sees an exception
2026-07-30 08:31:28 -04:00
Ilia Alshanetsky 8c5e258a00 Merge branch 'PHP-8.4' into PHP-8.5
* PHP-8.4:
  Free the hooked property value when json_encode() sees an exception
2026-07-30 08:24:47 -04:00
Ilia Alshanetsky c35253d364 Free the hooked property value when json_encode() sees an exception
php_json_encode_array() reads a hooked property into a local zval and
bails out when an exception is pending. The get hook can publish its
return value into that zval and then throw while its frame is freed,
for example from the destructor of one of its locals, so the bailout
leaks the value until request shutdown. Destroy it on the way out, the
way the other failure exit already does.

Closes GH-22919
2026-07-30 08:21:16 -04:00
MarcandTim Düsterhus 13169cd2fe json: Stop tracking columns in the success path (#22487)
Instead of tracking columns during lexing, which costs performance for
something that will only be required in the unexpected failure path, we now
only track the line numbers and calculate the column on demand when an error
occurs.

As part of this we also fix GH-22487 by adjusting the logic to report the
column based on the (UTF-8) column in the source, instead of treating
`\uXXXX` escapes as a single column, which users will need to count manually
instead of being able to rely on their editor or `mb_substr()` or similar.

[tim: (re)written the commit message]

Co-authored-by: Tim Düsterhus <tim@bastelstu.be>
2026-07-13 12:59:42 +02:00
Tim Düsterhus 68d0f56914 json: Report unterminated JSON strings as syntax errors (#22528)
Fixes php/php-src#22527.
2026-07-12 21:05:09 +02:00
Ilia Alshanetsky c74b2587fe Keep the object alive across jsonSerialize() in json_encode() (#22469)
php_json_encode_serializable_object() holds a raw pointer to the object
across the jsonSerialize() call, then reads its recursion guard and
compares the returned value's identity against it. A user error handler
triggered from jsonSerialize() can drop the last reference to the object,
for example by nulling a reference that aliases the encoded array slot,
freeing it before those reads and causing a use-after-free.

Hold a reference on the object across the call. The array path already
guards against this with a ZVAL_COPY; the JsonSerializable object path
did not. Same use-after-free class as GH-21024 in var_dump().
2026-06-29 10:20:44 -04:00
henderkes 915318ed9c make all static extensions use TSRMG_STATIC
Closes GH-22277
2026-06-26 14:18:52 +02:00
Tim Düsterhus cd80e3e807 json: Store errors in a structured fashion (#22421)
This will make it both easier to consume the error information and reduce the
chance for mistakes when settings errors, because not every field will need to
be set manually.

The functions that have been removed as part of this change were added in
master only, thus removing those is not an API change between the latest stable
(PHP 8.5) and this PR.

Fixes php/php-src#22420.
2026-06-25 21:26:21 +02:00
Ben Ramsey 1101afb730 license-update: ext/json source headers
RFC: https://wiki.php.net/rfc/php_license_update
2026-04-11 21:20:54 -05:00
Weilin Du a8cc04dc31 Optimize JSON pretty print indentation performance (GH-21474)
Grow the string buffer in advance, avoiding repeated reallocations for each indentation level.
2026-03-24 18:40:47 +01:00
Arnaud Le Blanc 65b4073922 Include the actual stub name in generated arginfo headers (#20993) 2026-01-21 20:57:00 +01:00
Juan Morales b80ffc5b2e Json last error msg/error message with location error (#20629)
This slightly extend error messages with locations taken from scanner / parser
2026-01-03 18:34:19 +01:00
Tim Düsterhus baa5319632 json: Improve performance of php_json_encode_array() for non-hooked fields (#20105)
`tmp` can only ever be non-undef if there's a hooked object property, which is
already an `UNEXPECTED()` case. Keep track of whether this case is hit or not
to avoid needlessly calling `zval_ptr_dtor()`.

For:

    <?php

    $len = 0;
    for ($i = 0; $i < 3_000_000; $i++) {
    	$len += strlen(json_encode(array_fill(0, 20, [])));
    }
    var_dump($len);

This is ~1.02 faster for a gcc 13.3 release build on a Intel(R) Core(TM)
i7-1365U.

    Benchmark 1: /tmp/bench/before /tmp/bench/test6.php
      Time (mean ± σ):     762.7 ms ±   3.2 ms    [User: 758.5 ms, System: 2.8 ms]
      Range (min … max):   759.2 ms … 769.3 ms    10 runs

    Benchmark 2: /tmp/bench/after /tmp/bench/test6.php
      Time (mean ± σ):     748.3 ms ±   9.0 ms    [User: 744.3 ms, System: 3.1 ms]
      Range (min … max):   740.8 ms … 766.2 ms    10 runs

    Summary
      /tmp/bench/after /tmp/bench/test6.php ran
        1.02 ± 0.01 times faster than /tmp/bench/before /tmp/bench/test6.php
2025-10-08 22:59:54 +02:00
Tim Düsterhus 18d99ee4b7 json: Improve performance of php_json_encode_array() (#20092)
Instead of using a boolean flag to check for each element whether or not it is
the first, we just unconditionally append a comma after each element and then
remove the last comma at the end.

For:

    <?php

    $len = 0;
    for ($i = 0; $i < 3_000_000; $i++) {
    	$len += strlen(json_encode(array_fill(0, 20, [])));
    }
    var_dump($len);

This is ~1.06 faster for a gcc 13.3 release build on a Intel(R) Core(TM)
i7-1365U.

    Benchmark 1: /tmp/bench/before /tmp/bench/test6.php
      Time (mean ± σ):     819.6 ms ±   2.8 ms    [User: 816.4 ms, System: 2.4 ms]
      Range (min … max):   816.9 ms … 825.0 ms    10 runs

    Benchmark 2: /tmp/bench/after /tmp/bench/test6.php
      Time (mean ± σ):     770.8 ms ±   5.8 ms    [User: 766.6 ms, System: 2.9 ms]
      Range (min … max):   765.3 ms … 785.8 ms    10 runs

    Summary
      /tmp/bench/after /tmp/bench/test6.php ran
        1.06 ± 0.01 times faster than /tmp/bench/before /tmp/bench/test6.php
2025-10-08 10:10:16 +02:00
Tim Düsterhus 2ce4806875 json: Use true / false instead of 1 / 0 when assigning to bool
Changes done with Coccinelle:

    @@
    bool b;
    @@

    - b = 0
    + b = false

    @@
    bool b;
    @@

    - b = 1
    + b = true
2025-09-24 18:51:40 +02:00
Gina Peter Banyard 5b3d0e4c09 ext/json: Refactor php_json_encode_array()
Stop relying on internal flags which were published in the header
Use a more descriptive variable name and have it be a boolean
2025-08-05 18:21:15 +01:00
Gina Peter Banyard 17328ef86b ext/json: Various small refactorings 2025-08-05 18:21:15 +01:00
Ilija Tovilo e58521c9e8 Merge branch 'PHP-8.4'
* PHP-8.4:
  Fix incorrect handling of hooked props without get hook in get_object_vars()
2025-03-08 12:27:56 +01:00
Ilija Tovilo 868959350f Fix incorrect handling of hooked props without get hook in get_object_vars()
Fixes GH-17988
Closes GH-17997
2025-03-08 12:27:28 +01:00
Gina Peter Banyard af1e289332 ext/json: Refactor php_json_encode_serializable_object() to call method directly 2025-01-13 13:46:25 +00:00
Gina Peter Banyard 75a15cf640 ext/json: Use zend_result type instead of int 2025-01-13 13:46:25 +00:00
Arnaud Le Blanc 4c212b305f Merge branch 'PHP-8.3' into PHP-8.4
* PHP-8.3:
  Fix tests: Prevent stack overflow during dtor
2024-10-24 15:58:12 +02:00
Arnaud Le Blanc f3e87e2a6d Fix tests: Prevent stack overflow during dtor
On s390x the stack is smaller and/or the object dtor code uses more stack,
which causes the destruction of deeply nested objects to crash in these
tests. Here I ensure that objects are released one by one at the end of the
tests to avoid recursive dtor.

Closes GH-16561
Fixes GH-16528
2024-10-24 15:56:25 +02:00
Niels Dossche 4a1694090b [ci skip] Skip test under ASAN
We backport 1d0fb36681 to PHP-8.3.
2024-10-01 13:58:40 +02:00
Niels Dossche bf1021c1a8 Fix typo 2024-09-30 23:05:30 +02:00
Niels Dossche 1d0fb36681 [ci skip] Skip test under ASAN 2024-09-30 22:46:05 +02:00
Niels Dossche 95d691ae00 Merge branch 'PHP-8.3' into PHP-8.4
* PHP-8.3:
  Fix GH-15168: stack overflow in json_encode()
2024-09-30 20:43:32 +02:00
Niels Dossche a551b99b2c Fix GH-15168: stack overflow in json_encode()
The JSON encoder is recursive, and it's far from easy to make it
iterative. Add a cheap stack limit check to prevent a segfault.
This uses the PHP_JSON_ERROR_DEPTH error code that already talks about
the stack depth. Previously this was only used for the $depth argument.

Closes GH-16059.
2024-09-30 20:42:01 +02:00
DanielEScherzer 53cb89670c Generated arginfo header files: remove empty zend_function_entry arrays (#15705)
When a class (or enum) has no methods, rather than using an array that only
contains `ZEND_FE_END`, use `NULL` for the functions. The implementation of
class registration for internal classes, `do_register_internal_class()` in
zend_API.c, already skips classes where the functions are `NULL`. By removing
these unneeded arrays, we can reduce the size of the header files, while also
removing an unneeded call to zend_register_functions() for each internal class
with no extra methods.
2024-09-03 23:19:53 +02:00
Arnaud Le Blanc 58aa6fc830 Lazy objects
RFC: https://wiki.php.net/rfc/lazy-objects

Closes GH-15019
2024-08-30 17:30:03 +02:00
Máté Kocsis 8d12f666ae Fix registration of internal readonly child classes (#15459)
Currently, internal classes are registered with the following code:

INIT_CLASS_ENTRY(ce, "InternalClass", class_InternalClass_methods);
class_entry = zend_register_internal_class_ex(&ce, NULL);
class_entry->ce_flags |= ...;

This has worked well so far, except if InternalClass is readonly. It is because some inheritance checks are run by zend_register_internal_class_ex before ZEND_ACC_READONLY_CLASS is added to ce_flags.

The issue is fixed by adding a zend_register_internal_class_with_flags() zend API function that stubs can use from now on. This function makes sure to add the flags before running any checks. Since the new API is not available in lower PHP versions, gen_stub.php has to keep support for the existing API for PHP 8.3 and below.
2024-08-24 12:36:54 +02:00
Peter Kokot 9cc63e1de9 Autotools: Normalize headers arguments (#15149)
Refactor all "long" arguments into blank-or-newline-separated list of
files with m4_normalize.
2024-07-29 10:08:17 +02:00
Peter Kokot 1ceadaed52 Autotools: Normalize and quote all PHP_NEW_EXTENSION arguments (#15144)
This adds Autoconf quote characters to all PHP_NEW_EXTENSION arguments
and syncs the CS across the php-src Autotools build system.
2024-07-29 00:14:59 +02:00
Ilija ToviloandNikita Popov 780a8280d2 [RFC] Property hooks (#13455)
RFC: https://wiki.php.net/rfc/property-hooks

Co-authored-by: Nikita Popov <nikita.ppv@gmail.com>
2024-07-14 11:55:03 +02:00
Peter Kokot dc7b67ebc3 Autotools: Sync PHP_ADD_MAKEFILE_FRAGMENT (#14766)
- Macro help text updated for extensions and general usage
- Arguments quoted
- dnl removes redundant newlines in the generated configure script
2024-07-03 13:15:13 +02:00
Peter Kokot 212b2834e9 Autotools: Sync indentation style in build system files (#14725) 2024-06-29 23:25:17 +02:00
Peter Kokot c44834d8ad Trim trailing whitespace (#14721) 2024-06-29 18:41:45 +02:00
Arnaud Le Blanc 11accb5cdf Preferably include from build dir (#13516)
* Include from build dir first

This fixes out of tree builds by ensuring that configure artifacts are included
from the build dir.

Before, out of tree builds would preferably include files from the src dir, as
the include path was defined as follows (ignoring includes from ext/ and sapi/) :

    -I$(top_builddir)/main
    -I$(top_srcdir)
    -I$(top_builddir)/TSRM
    -I$(top_builddir)/Zend
    -I$(top_srcdir)/main
    -I$(top_srcdir)/Zend
    -I$(top_srcdir)/TSRM
    -I$(top_builddir)/

As a result, an out of tree build would include configure artifacts such as
`main/php_config.h` from the src dir.

After this change, the include path is defined as follows:

    -I$(top_builddir)/main
    -I$(top_builddir)
    -I$(top_srcdir)/main
    -I$(top_srcdir)
    -I$(top_builddir)/TSRM
    -I$(top_builddir)/Zend
    -I$(top_srcdir)/Zend
    -I$(top_srcdir)/TSRM

* Fix extension include path for out of tree builds

* Include config.h with the brackets form

`#include "config.h"` searches in the directory containing the including-file
before any other include path. This can include the wrong config.h when building
out of tree and a config.h exists in the source tree.

Using `#include <config.h>` uses exclusively the include path, and gives
priority to the build dir.
2024-06-26 00:26:43 +02:00
Peter Kokot f3feef8b93 Define default RE2C_FLAGS (#14615)
The --no-generation-date flag is a common re2c flag used in all re2c
invocations. This adds the 2nd optional argument to PHP_PROG_RE2C M4
macro in BC manner to set the default re2c command-line options and sets
the default RE2C_FLAGS similarly on Windows.
2024-06-24 22:09:04 +02:00
Gina Peter Banyard fd2d869642 Clean-up some more headers (#14416)
Remove unused headers (such as php_ini.h for extensions that don't define INI settings)
Use more specific headers when possible
2024-06-08 17:15:36 +01:00
Gina Peter Banyard efee76b8e2 ext/json: Fix sign conversion warnings 2024-06-08 17:15:01 +01:00