)]}'
{
  "commit": "64e2b53235aa33b5bad5442449a092b5729be66a",
  "tree": "2792379de069fcf35353475d9b300e1201ed4d4a",
  "parents": [
    "c5ed3c8da39037e3b379f68a766e2118c84bbaef"
  ],
  "author": {
    "name": "Behdad Esfahbod",
    "email": "behdad@behdad.org",
    "time": "Thu Sep 10 22:19:47 2026 -0600"
  },
  "committer": {
    "name": "GitHub",
    "email": "noreply@github.com",
    "time": "Thu Sep 10 22:19:47 2026 -0600"
  },
  "message": "[glyf] Charge point loading to the work budget before doing the work (#6256)\n\nThe glyf outline budget was only charged after a glyph loaded\nsuccessfully: Glyph::get_points() spent 16 units per node up front, and\nglyf_accelerator_t::get_points() charged one unit per point only after\nthe whole tree came back.  A glyph that loaded ~175K points and then\ntripped a structural cap (HB_GLYF_MAX_POINTS, edge count) paid for the\nnodes but not the points.  Driven from a COLR paint walk through\nhb_font_get_glyph_extents(), one such glyph was loaded and thrown away\nover 8000 times per session within the budget, ~1.4G point loads.\n\nCharge at the point where the work is attempted instead:\n\n- SimpleGlyph::get_contour_points() takes the budget and charges\n  num_points before allocating, clearing, and reading, so truncated or\n  later-rejected glyphs pay for the points they allocate.\n\n- Composite levels charge the component subtree size before\n  transform_points(), since each nesting level transforms every point\n  below it and that multiplication was previously invisible to the\n  budget.\n\nThe terminal per-point charge for path emission is unchanged.\n\nLocal hb-vector-fuzzer run on the testcase: 4.3s -\u003e 0.12s.  Full test\nsuite passes.  The testcase is added as a fuzz seed.\n\nFixes: https://oss-fuzz.com/testcase-detail/5714817420427264\n\n\nClaude-Session: https://claude.ai/code/session_013ksLGe7wUVwbuANqR56YaN\n\nCo-authored-by: Claude Fable 5.1 \u003cnoreply@anthropic.com\u003e",
  "tree_diff": [
    {
      "type": "modify",
      "old_id": "1376d5386131376152d478fdc1ae6ba9f915c3ea",
      "old_mode": 33188,
      "old_path": "src/OT/glyf/Glyph.hh",
      "new_id": "3a1e620b70fa95a5648eca61aa2d78228beed3c1",
      "new_mode": 33188,
      "new_path": "src/OT/glyf/Glyph.hh"
    },
    {
      "type": "modify",
      "old_id": "74c6509ece436b85a00a6242ecef49731460b6e6",
      "old_mode": 33188,
      "old_path": "src/OT/glyf/SimpleGlyph.hh",
      "new_id": "a61b2866cf6b0dc493184100a28ff5f112642008",
      "new_mode": 33188,
      "new_path": "src/OT/glyf/SimpleGlyph.hh"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "72d1c741362dfed807a752bbd0a89d7fe1b547f7",
      "new_mode": 33188,
      "new_path": "test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-vector-fuzzer-5714817420427264"
    }
  ]
}
