{
 "commit": "3584a98bda0f2c0d367255b046798b0d3a221a19",
 "short": "3584a98bd",
 "repo": "https://github.com/php/php-src",
 "layers": [
  {
   "id": "vulnerability",
   "name": "The flaws",
   "note": "The two CVEs, from their records and GitHub advisories."
  },
  {
   "id": "remediation",
   "name": "What the fix does",
   "note": "The design of the patch, read from the diff and the commit message, checked against the two GHSAs. It describes the remediation."
  },
  {
   "id": "code",
   "name": "The code",
   "note": "Files and functions the fix changed, derived from the diff by a parser, never a model: 389 files, 113 of them not tests."
  }
 ],
 "nodes": [
  {
   "id": "cve-109618",
   "layer": "vulnerability",
   "name": "CVE-2026-109618: RCE via OOM corruption",
   "text": "An out-of-memory condition during request handling could leave request memory in an uninitialised state that later cleanup reads. CVSS v4.0 9.2. GHSA-w8hw-w9fx-j79w.",
   "source": "cve-cve-2026-109618",
   "cvss": "9.2"
  },
  {
   "id": "cve-109619",
   "layer": "vulnerability",
   "name": "CVE-2026-109619: RCE via stale global state",
   "text": "Global state that referenced request memory was not always reset, so a later request on the same worker could read freed memory. CVSS v4.0 9.2. GHSA-6wmf-4rv5-p3rp.",
   "source": "cve-cve-2026-109619",
   "cvss": "9.2"
  },
  {
   "id": "fix-commit",
   "layer": "remediation",
   "name": "The fix commit 3584a98bd",
   "text": "\"Avoid state corruption via bailout\", by Arnaud Le Blanc with Ilija Tovilo, Jakub Zelenka, Nora Dossche and Nicolas Grekas. Authored 2026-10-18 15:26 UTC; public on the branches 2026-10-21 14:06 UTC. 389 files, +10,689 / -976.",
   "source": "github-php-src-fix-commit-3584a98bd",
   "url": "https://github.com/php/php-src/commit/3584a98bda0f2c0d367255b046798b0d3a221a19"
  },
  {
   "id": "fix-soft-limit",
   "layer": "remediation",
   "name": "A soft memory limit that no longer jumps",
   "text": "At the memory limit the allocator stops using the longjmp bailout; it queues a delayed error and lets the allocation proceed, so the fatal is raised later with request state intact.",
   "func": "zend_mm_check_limit, zend_mm_delayed_error",
   "file": "Zend/zend_alloc.c"
  },
  {
   "id": "fix-hard-limit",
   "layer": "remediation",
   "name": "A hard limit that ends the process cleanly",
   "text": "A new memory_hard_limit_percent sets a ceiling above memory_limit; reaching it ends the worker with _exit(), leaving no cleanup to corrupt. zend_mm_panic also uses _exit now.",
   "func": "zend_mm_hard_limit_error",
   "file": "Zend/zend_alloc.c",
   "ini": "memory_hard_limit_percent"
  },
  {
   "id": "fix-unwind",
   "layer": "remediation",
   "name": "An orderly unwind at the next safe point",
   "text": "The queued error is handled at a VM safe point: it throws an UnwindExit that unwinds the PHP frames in order before the fatal, rather than a C longjmp across half-built state.",
   "func": "zend_handle_delayed_oom, zend_throw_unwind_exit",
   "file": "Zend/zend_execute_API.c"
  },
  {
   "id": "fix-reset-globals",
   "layer": "remediation",
   "name": "Request globals reset so nothing survives a failure",
   "text": "Shutdown and deactivate paths set freed pointers to NULL or UNDEF, 'may be accessed before php_request_startup()', so a later request cannot find stale state.",
   "func": "shutdown_executor, php_request_shutdown, sapi_deactivate",
   "file": "Zend/zend_execute_API.c, main/main.c, main/SAPI.c"
  },
  {
   "id": "fix-bounded-parsing",
   "layer": "remediation",
   "name": "Bounded, deduplicated request parsing",
   "text": "A new max_multipart_body_parts caps the number of parts the body parser accepts; the multipart header parser keeps only the two headers it uses and ignores duplicates; the session upload-progress callback is changed.",
   "func": "multipart_buffer_headers, rfc1867_post_handler",
   "file": "main/rfc1867.c, ext/session/session.c",
   "ini": "max_multipart_body_parts"
  },
  {
   "id": "fix-fallible",
   "layer": "remediation",
   "name": "Allocations that may fail instead of abort",
   "text": "Allocation paths a caller can tolerate failing become 'fallible' and return NULL rather than jumping, which is what lets the new tests exercise the OOM handling at any allocation.",
   "func": "fallible allocation family",
   "file": "Zend/zend_alloc.c, Zend/zend_hash.c, Zend/zend_string.c"
  },
  {
   "id": "area:Zend/",
   "layer": "code",
   "name": "Area Zend/",
   "text": "96 files changed, +2932 / -268.",
   "count": 96,
   "add": 2932,
   "dele": 268
  },
  {
   "id": "area:tests/",
   "layer": "code",
   "name": "Area tests/",
   "text": "34 files changed, +1109 / -1.",
   "count": 34,
   "add": 1109,
   "dele": 1
  },
  {
   "id": "area:ext/standard",
   "layer": "code",
   "name": "Area ext/standard",
   "text": "52 files changed, +1061 / -85.",
   "count": 52,
   "add": 1061,
   "dele": 85
  },
  {
   "id": "area:ext/mbstring",
   "layer": "code",
   "name": "Area ext/mbstring",
   "text": "30 files changed, +570 / -76.",
   "count": 30,
   "add": 570,
   "dele": 76
  },
  {
   "id": "area:ext/gd",
   "layer": "code",
   "name": "Area ext/gd",
   "text": "19 files changed, +498 / -17.",
   "count": 19,
   "add": 498,
   "dele": 17
  },
  {
   "id": "area:ext/session",
   "layer": "code",
   "name": "Area ext/session",
   "text": "5 files changed, +416 / -63.",
   "count": 5,
   "add": 416,
   "dele": 63
  },
  {
   "id": "area:ext/soap",
   "layer": "code",
   "name": "Area ext/soap",
   "text": "14 files changed, +375 / -8.",
   "count": 14,
   "add": 375,
   "dele": 8
  },
  {
   "id": "area:main/",
   "layer": "code",
   "name": "Area main/",
   "text": "7 files changed, +345 / -50.",
   "count": 7,
   "add": 345,
   "dele": 50
  },
  {
   "id": "area:ext/zlib",
   "layer": "code",
   "name": "Area ext/zlib",
   "text": "11 files changed, +344 / -10.",
   "count": 11,
   "add": 344,
   "dele": 10
  },
  {
   "id": "area:ext/filter",
   "layer": "code",
   "name": "Area ext/filter",
   "text": "8 files changed, +335 / -9.",
   "count": 8,
   "add": 335,
   "dele": 9
  },
  {
   "id": "area:ext/date",
   "layer": "code",
   "name": "Area ext/date",
   "text": "17 files changed, +326 / -122.",
   "count": 17,
   "add": 326,
   "dele": 122
  },
  {
   "id": "area:ext/exif",
   "layer": "code",
   "name": "Area ext/exif",
   "text": "8 files changed, +318 / -23.",
   "count": 8,
   "add": 318,
   "dele": 23
  },
  {
   "id": "area:ext/zend_test",
   "layer": "code",
   "name": "Area ext/zend_test",
   "text": "8 files changed, +278 / -42.",
   "count": 8,
   "add": 278,
   "dele": 42
  },
  {
   "id": "area:ext/xmlreader",
   "layer": "code",
   "name": "Area ext/xmlreader",
   "text": "8 files changed, +236 / -5.",
   "count": 8,
   "add": 236,
   "dele": 5
  },
  {
   "id": "area:ext/pcre",
   "layer": "code",
   "name": "Area ext/pcre",
   "text": "8 files changed, +186 / -10.",
   "count": 8,
   "add": 186,
   "dele": 10
  },
  {
   "id": "area:ext/fileinfo",
   "layer": "code",
   "name": "Area ext/fileinfo",
   "text": "3 files changed, +168 / -51.",
   "count": 3,
   "add": 168,
   "dele": 51
  },
  {
   "id": "area:ext/iconv",
   "layer": "code",
   "name": "Area ext/iconv",
   "text": "7 files changed, +146 / -11.",
   "count": 7,
   "add": 146,
   "dele": 11
  },
  {
   "id": "area:ext/json",
   "layer": "code",
   "name": "Area ext/json",
   "text": "8 files changed, +137 / -23.",
   "count": 8,
   "add": 137,
   "dele": 23
  },
  {
   "id": "area:ext/simplexml",
   "layer": "code",
   "name": "Area ext/simplexml",
   "text": "4 files changed, +134 / -26.",
   "count": 4,
   "add": 134,
   "dele": 26
  },
  {
   "id": "area:ext/opcache",
   "layer": "code",
   "name": "Area ext/opcache",
   "text": "7 files changed, +113 / -11.",
   "count": 7,
   "add": 113,
   "dele": 11
  },
  {
   "id": "area:ext/bz2",
   "layer": "code",
   "name": "Area ext/bz2",
   "text": "5 files changed, +105 / -6.",
   "count": 5,
   "add": 105,
   "dele": 6
  },
  {
   "id": "area:ext/xml",
   "layer": "code",
   "name": "Area ext/xml",
   "text": "4 files changed, +103 / -2.",
   "count": 4,
   "add": 103,
   "dele": 2
  },
  {
   "id": "area:ext/curl",
   "layer": "code",
   "name": "Area ext/curl",
   "text": "4 files changed, +95 / -1.",
   "count": 4,
   "add": 95,
   "dele": 1
  },
  {
   "id": "area:ext/intl",
   "layer": "code",
   "name": "Area ext/intl",
   "text": "6 files changed, +75 / -4.",
   "count": 6,
   "add": 75,
   "dele": 4
  },
  {
   "id": "area:sapi/cli",
   "layer": "code",
   "name": "Area sapi/cli",
   "text": "2 files changed, +73 / -0.",
   "count": 2,
   "add": 73,
   "dele": 0
  },
  {
   "id": "area:ext/spl",
   "layer": "code",
   "name": "Area ext/spl",
   "text": "1 file changed, +64 / -26.",
   "count": 1,
   "add": 64,
   "dele": 26
  },
  {
   "id": "area:ext/tokenizer",
   "layer": "code",
   "name": "Area ext/tokenizer",
   "text": "2 files changed, +64 / -15.",
   "count": 2,
   "add": 64,
   "dele": 15
  },
  {
   "id": "area:ext/dom",
   "layer": "code",
   "name": "Area ext/dom",
   "text": "2 files changed, +36 / -1.",
   "count": 2,
   "add": 36,
   "dele": 1
  },
  {
   "id": "area:ext/imap",
   "layer": "code",
   "name": "Area ext/imap",
   "text": "2 files changed, +14 / -1.",
   "count": 2,
   "add": 14,
   "dele": 1
  },
  {
   "id": "area:run-tests.php/",
   "layer": "code",
   "name": "Area run-tests.php/",
   "text": "1 file changed, +8 / -4.",
   "count": 1,
   "add": 8,
   "dele": 4
  },
  {
   "id": "area:sapi/fuzzer",
   "layer": "code",
   "name": "Area sapi/fuzzer",
   "text": "1 file changed, +8 / -0.",
   "count": 1,
   "add": 8,
   "dele": 0
  },
  {
   "id": "area:ext/libxml",
   "layer": "code",
   "name": "Area ext/libxml",
   "text": "1 file changed, +6 / -2.",
   "count": 1,
   "add": 6,
   "dele": 2
  },
  {
   "id": "area:ext/xmlwriter",
   "layer": "code",
   "name": "Area ext/xmlwriter",
   "text": "1 file changed, +5 / -1.",
   "count": 1,
   "add": 5,
   "dele": 1
  },
  {
   "id": "area:ext/shmop",
   "layer": "code",
   "name": "Area ext/shmop",
   "text": "1 file changed, +4 / -1.",
   "count": 1,
   "add": 4,
   "dele": 1
  },
  {
   "id": "area:sapi/fpm",
   "layer": "code",
   "name": "Area sapi/fpm",
   "text": "1 file changed, +1 / -0.",
   "count": 1,
   "add": 1,
   "dele": 0
  },
  {
   "id": "area:sapi/phpdbg",
   "layer": "code",
   "name": "Area sapi/phpdbg",
   "text": "1 file changed, +1 / -1.",
   "count": 1,
   "add": 1,
   "dele": 1
  },
  {
   "id": "file:Zend/zend_alloc.c",
   "layer": "code",
   "name": "file Zend/zend_alloc.c",
   "text": "+527 / -122. Functions the fix changed: typedef zend_mm_bitset zend_mm_page_map[ZEND_MM_PAGE_MAP_LEN];     /* 64B */, zend_mm_use_huge_pages = false;, struct _zend_mm_heap, zend_mm_panic, zend_mm_safe_error, *zend_mm_alloc_pages, *zend_mm_alloc_large_ex, zend_never_inline void *zend_mm_alloc_small_slow.",
   "url": "https://github.com/php/php-src/blob/3584a98bda0f2c0d367255b046798b0d3a221a19/Zend/zend_alloc.c",
   "functions": [
    "typedef zend_mm_bitset zend_mm_page_map[ZEND_MM_PAGE_MAP_LEN];     /* 64B */",
    "zend_mm_use_huge_pages = false;",
    "struct _zend_mm_heap",
    "zend_mm_panic",
    "zend_mm_safe_error",
    "*zend_mm_alloc_pages",
    "*zend_mm_alloc_large_ex",
    "zend_never_inline void *zend_mm_alloc_small_slow"
   ],
   "add": 527,
   "dele": 122
  },
  {
   "id": "file:Zend/zend_execute_API.c",
   "layer": "code",
   "name": "file Zend/zend_execute_API.c",
   "text": "+36 / -13. Functions the fix changed: zend_shutdown_executor_values, shutdown_executor, zend_call_function.",
   "url": "https://github.com/php/php-src/blob/3584a98bda0f2c0d367255b046798b0d3a221a19/Zend/zend_execute_API.c",
   "functions": [
    "zend_shutdown_executor_values",
    "shutdown_executor",
    "zend_call_function"
   ],
   "add": 36,
   "dele": 13
  },
  {
   "id": "file:Zend/zend_hash.c",
   "layer": "code",
   "name": "file Zend/zend_hash.c",
   "text": "+259 / -43. Functions the fix changed: _zend_is_inconsistent, *zend_hash_find_ptr_lc, zend_hash_do_resize, uint32_t zend_hash_check_size, zend_hash_real_init_packed_ex, zend_hash_real_init_mixed_ex, zend_hash_real_init_ex, const HashTable zend_empty_array =.",
   "url": "https://github.com/php/php-src/blob/3584a98bda0f2c0d367255b046798b0d3a221a19/Zend/zend_hash.c",
   "functions": [
    "_zend_is_inconsistent",
    "*zend_hash_find_ptr_lc",
    "zend_hash_do_resize",
    "uint32_t zend_hash_check_size",
    "zend_hash_real_init_packed_ex",
    "zend_hash_real_init_mixed_ex",
    "zend_hash_real_init_ex",
    "const HashTable zend_empty_array ="
   ],
   "add": 259,
   "dele": 43
  },
  {
   "id": "file:Zend/zend_string.c",
   "layer": "code",
   "name": "file Zend/zend_string.c",
   "text": "+20 / -2. Functions the fix changed: zend_interned_strings_dtor, zend_string* ZEND_FASTCALL zend_string_init_existing_interned_permanent, zend_string* ZEND_FASTCALL zend_string_init_existing_interned_request.",
   "url": "https://github.com/php/php-src/blob/3584a98bda0f2c0d367255b046798b0d3a221a19/Zend/zend_string.c",
   "functions": [
    "zend_interned_strings_dtor",
    "zend_string* ZEND_FASTCALL zend_string_init_existing_interned_permanent",
    "zend_string* ZEND_FASTCALL zend_string_init_existing_interned_request"
   ],
   "add": 20,
   "dele": 2
  },
  {
   "id": "file:Zend/zend_types.h",
   "layer": "code",
   "name": "file Zend/zend_types.h",
   "text": "+15 / -11. Functions the fix changed: struct _zend_array.",
   "url": "https://github.com/php/php-src/blob/3584a98bda0f2c0d367255b046798b0d3a221a19/Zend/zend_types.h",
   "functions": [
    "struct _zend_array"
   ],
   "add": 15,
   "dele": 11
  },
  {
   "id": "file:ext/session/session.c",
   "layer": "code",
   "name": "file ext/session/session.c",
   "text": "+56 / -11. Functions the fix changed: php_rinit_session_globals, PHP_INI_END, PS_SERIALIZER_ENCODE_FUNC, PS_SERIALIZER_DECODE_FUNC, PHP_GINIT_FUNCTION, php_session_rfc1867_update, php_session_rfc1867_cleanup, php_session_rfc1867_callback.",
   "url": "https://github.com/php/php-src/blob/3584a98bda0f2c0d367255b046798b0d3a221a19/ext/session/session.c",
   "functions": [
    "php_rinit_session_globals",
    "PHP_INI_END",
    "PS_SERIALIZER_ENCODE_FUNC",
    "PS_SERIALIZER_DECODE_FUNC",
    "PHP_GINIT_FUNCTION",
    "php_session_rfc1867_update",
    "php_session_rfc1867_cleanup",
    "php_session_rfc1867_callback"
   ],
   "add": 56,
   "dele": 11
  },
  {
   "id": "file:main/SAPI.c",
   "layer": "code",
   "name": "file main/SAPI.c",
   "text": "+6 / -2. Functions the fix changed: sapi_handle_post, sapi_getenv.",
   "url": "https://github.com/php/php-src/blob/3584a98bda0f2c0d367255b046798b0d3a221a19/main/SAPI.c",
   "functions": [
    "sapi_handle_post",
    "sapi_getenv"
   ],
   "add": 6,
   "dele": 2
  },
  {
   "id": "file:main/main.c",
   "layer": "code",
   "name": "file main/main.c",
   "text": "+48 / -2. Functions the fix changed: PHP_INI_MH, PHP_INI_BEGIN, php_verror, php_error_cb, php_request_startup, php_request_shutdown.",
   "url": "https://github.com/php/php-src/blob/3584a98bda0f2c0d367255b046798b0d3a221a19/main/main.c",
   "functions": [
    "PHP_INI_MH",
    "PHP_INI_BEGIN",
    "php_verror",
    "php_error_cb",
    "php_request_startup",
    "php_request_shutdown"
   ],
   "add": 48,
   "dele": 2
  },
  {
   "id": "file:main/rfc1867.c",
   "layer": "code",
   "name": "file main/rfc1867.c",
   "text": "+188 / -27. Functions the fix changed: normalize_protected_variable, add_protected_variable, is_protected_variable, safe_php_register_variable, safe_php_register_variable_ex, register_http_post_files_variable, register_http_post_files_variable_ex, fill_buffer.",
   "url": "https://github.com/php/php-src/blob/3584a98bda0f2c0d367255b046798b0d3a221a19/main/rfc1867.c",
   "functions": [
    "normalize_protected_variable",
    "add_protected_variable",
    "is_protected_variable",
    "safe_php_register_variable",
    "safe_php_register_variable_ex",
    "register_http_post_files_variable",
    "register_http_post_files_variable_ex",
    "fill_buffer"
   ],
   "add": 188,
   "dele": 27
  }
 ],
 "edges": [
  {
   "from": "fix-commit",
   "to": "fix-soft-limit",
   "rel": "introduces"
  },
  {
   "from": "fix-commit",
   "to": "fix-hard-limit",
   "rel": "introduces"
  },
  {
   "from": "fix-commit",
   "to": "fix-unwind",
   "rel": "introduces"
  },
  {
   "from": "fix-commit",
   "to": "fix-reset-globals",
   "rel": "introduces"
  },
  {
   "from": "fix-commit",
   "to": "fix-bounded-parsing",
   "rel": "introduces"
  },
  {
   "from": "fix-commit",
   "to": "fix-fallible",
   "rel": "introduces"
  },
  {
   "from": "fix-commit",
   "to": "cve-109618",
   "rel": "fixes"
  },
  {
   "from": "fix-commit",
   "to": "cve-109619",
   "rel": "fixes"
  },
  {
   "from": "fix-soft-limit",
   "to": "cve-109618",
   "rel": "addresses"
  },
  {
   "from": "fix-hard-limit",
   "to": "cve-109618",
   "rel": "addresses"
  },
  {
   "from": "fix-unwind",
   "to": "cve-109618",
   "rel": "addresses"
  },
  {
   "from": "fix-fallible",
   "to": "cve-109618",
   "rel": "addresses"
  },
  {
   "from": "fix-reset-globals",
   "to": "cve-109619",
   "rel": "addresses"
  },
  {
   "from": "fix-bounded-parsing",
   "to": "cve-109619",
   "rel": "addresses"
  },
  {
   "from": "fix-commit",
   "to": "area:Zend/",
   "rel": "touches"
  },
  {
   "from": "fix-commit",
   "to": "area:tests/",
   "rel": "touches"
  },
  {
   "from": "fix-commit",
   "to": "area:ext/standard",
   "rel": "touches"
  },
  {
   "from": "fix-commit",
   "to": "area:ext/mbstring",
   "rel": "touches"
  },
  {
   "from": "fix-commit",
   "to": "area:ext/gd",
   "rel": "touches"
  },
  {
   "from": "fix-commit",
   "to": "area:ext/session",
   "rel": "touches"
  },
  {
   "from": "fix-commit",
   "to": "area:ext/soap",
   "rel": "touches"
  },
  {
   "from": "fix-commit",
   "to": "area:main/",
   "rel": "touches"
  },
  {
   "from": "fix-commit",
   "to": "area:ext/zlib",
   "rel": "touches"
  },
  {
   "from": "fix-commit",
   "to": "area:ext/filter",
   "rel": "touches"
  },
  {
   "from": "fix-commit",
   "to": "area:ext/date",
   "rel": "touches"
  },
  {
   "from": "fix-commit",
   "to": "area:ext/exif",
   "rel": "touches"
  },
  {
   "from": "fix-commit",
   "to": "area:ext/zend_test",
   "rel": "touches"
  },
  {
   "from": "fix-commit",
   "to": "area:ext/xmlreader",
   "rel": "touches"
  },
  {
   "from": "fix-commit",
   "to": "area:ext/pcre",
   "rel": "touches"
  },
  {
   "from": "fix-commit",
   "to": "area:ext/fileinfo",
   "rel": "touches"
  },
  {
   "from": "fix-commit",
   "to": "area:ext/iconv",
   "rel": "touches"
  },
  {
   "from": "fix-commit",
   "to": "area:ext/json",
   "rel": "touches"
  },
  {
   "from": "fix-commit",
   "to": "area:ext/simplexml",
   "rel": "touches"
  },
  {
   "from": "fix-commit",
   "to": "area:ext/opcache",
   "rel": "touches"
  },
  {
   "from": "fix-commit",
   "to": "area:ext/bz2",
   "rel": "touches"
  },
  {
   "from": "fix-commit",
   "to": "area:ext/xml",
   "rel": "touches"
  },
  {
   "from": "fix-commit",
   "to": "area:ext/curl",
   "rel": "touches"
  },
  {
   "from": "fix-commit",
   "to": "area:ext/intl",
   "rel": "touches"
  },
  {
   "from": "fix-commit",
   "to": "area:sapi/cli",
   "rel": "touches"
  },
  {
   "from": "fix-commit",
   "to": "area:ext/spl",
   "rel": "touches"
  },
  {
   "from": "fix-commit",
   "to": "area:ext/tokenizer",
   "rel": "touches"
  },
  {
   "from": "fix-commit",
   "to": "area:ext/dom",
   "rel": "touches"
  },
  {
   "from": "fix-commit",
   "to": "area:ext/imap",
   "rel": "touches"
  },
  {
   "from": "fix-commit",
   "to": "area:run-tests.php/",
   "rel": "touches"
  },
  {
   "from": "fix-commit",
   "to": "area:sapi/fuzzer",
   "rel": "touches"
  },
  {
   "from": "fix-commit",
   "to": "area:ext/libxml",
   "rel": "touches"
  },
  {
   "from": "fix-commit",
   "to": "area:ext/xmlwriter",
   "rel": "touches"
  },
  {
   "from": "fix-commit",
   "to": "area:ext/shmop",
   "rel": "touches"
  },
  {
   "from": "fix-commit",
   "to": "area:sapi/fpm",
   "rel": "touches"
  },
  {
   "from": "fix-commit",
   "to": "area:sapi/phpdbg",
   "rel": "touches"
  },
  {
   "from": "fix-soft-limit",
   "to": "file:Zend/zend_alloc.c",
   "rel": "realised in"
  },
  {
   "from": "area:Zend",
   "to": "file:Zend/zend_alloc.c",
   "rel": "contains"
  },
  {
   "from": "fix-unwind",
   "to": "file:Zend/zend_execute_API.c",
   "rel": "realised in"
  },
  {
   "from": "area:Zend",
   "to": "file:Zend/zend_execute_API.c",
   "rel": "contains"
  },
  {
   "from": "fix-fallible",
   "to": "file:Zend/zend_hash.c",
   "rel": "realised in"
  },
  {
   "from": "area:Zend",
   "to": "file:Zend/zend_hash.c",
   "rel": "contains"
  },
  {
   "from": "fix-fallible",
   "to": "file:Zend/zend_string.c",
   "rel": "realised in"
  },
  {
   "from": "area:Zend",
   "to": "file:Zend/zend_string.c",
   "rel": "contains"
  },
  {
   "from": "fix-fallible",
   "to": "file:Zend/zend_types.h",
   "rel": "realised in"
  },
  {
   "from": "area:Zend",
   "to": "file:Zend/zend_types.h",
   "rel": "contains"
  },
  {
   "from": "fix-bounded-parsing",
   "to": "file:ext/session/session.c",
   "rel": "realised in"
  },
  {
   "from": "area:ext/session",
   "to": "file:ext/session/session.c",
   "rel": "contains"
  },
  {
   "from": "fix-reset-globals",
   "to": "file:main/SAPI.c",
   "rel": "realised in"
  },
  {
   "from": "area:main",
   "to": "file:main/SAPI.c",
   "rel": "contains"
  },
  {
   "from": "fix-reset-globals",
   "to": "file:main/main.c",
   "rel": "realised in"
  },
  {
   "from": "area:main",
   "to": "file:main/main.c",
   "rel": "contains"
  },
  {
   "from": "fix-bounded-parsing",
   "to": "file:main/rfc1867.c",
   "rel": "realised in"
  },
  {
   "from": "area:main",
   "to": "file:main/rfc1867.c",
   "rel": "contains"
  }
 ],
 "counts": {
  "files": 389,
  "engine_files": 37,
  "areas": 36,
  "nodes": 54,
  "edges": 68
 },
 "areas": [
  [
   "Zend/",
   96,
   2932,
   268
  ],
  [
   "tests/",
   34,
   1109,
   1
  ],
  [
   "ext/standard",
   52,
   1061,
   85
  ],
  [
   "ext/mbstring",
   30,
   570,
   76
  ],
  [
   "ext/gd",
   19,
   498,
   17
  ],
  [
   "ext/session",
   5,
   416,
   63
  ],
  [
   "ext/soap",
   14,
   375,
   8
  ],
  [
   "main/",
   7,
   345,
   50
  ],
  [
   "ext/zlib",
   11,
   344,
   10
  ],
  [
   "ext/filter",
   8,
   335,
   9
  ],
  [
   "ext/date",
   17,
   326,
   122
  ],
  [
   "ext/exif",
   8,
   318,
   23
  ],
  [
   "ext/zend_test",
   8,
   278,
   42
  ],
  [
   "ext/xmlreader",
   8,
   236,
   5
  ],
  [
   "ext/pcre",
   8,
   186,
   10
  ],
  [
   "ext/fileinfo",
   3,
   168,
   51
  ],
  [
   "ext/iconv",
   7,
   146,
   11
  ],
  [
   "ext/json",
   8,
   137,
   23
  ],
  [
   "ext/simplexml",
   4,
   134,
   26
  ],
  [
   "ext/opcache",
   7,
   113,
   11
  ],
  [
   "ext/bz2",
   5,
   105,
   6
  ],
  [
   "ext/xml",
   4,
   103,
   2
  ],
  [
   "ext/curl",
   4,
   95,
   1
  ],
  [
   "ext/intl",
   6,
   75,
   4
  ],
  [
   "sapi/cli",
   2,
   73,
   0
  ],
  [
   "ext/spl",
   1,
   64,
   26
  ],
  [
   "ext/tokenizer",
   2,
   64,
   15
  ],
  [
   "ext/dom",
   2,
   36,
   1
  ],
  [
   "ext/imap",
   2,
   14,
   1
  ],
  [
   "run-tests.php/",
   1,
   8,
   4
  ],
  [
   "sapi/fuzzer",
   1,
   8,
   0
  ],
  [
   "ext/libxml",
   1,
   6,
   2
  ],
  [
   "ext/xmlwriter",
   1,
   5,
   1
  ],
  [
   "ext/shmop",
   1,
   4,
   1
  ],
  [
   "sapi/fpm",
   1,
   1,
   0
  ],
  [
   "sapi/phpdbg",
   1,
   1,
   1
  ]
 ]
}
