)]}'
{
  "commit": "e0dd7ca096b3a64bbc6b7e68ffd8f20c5fdcc24a",
  "tree": "8cd85327e95cf5c21c877766f7b33bf09854e206",
  "parents": [
    "71b984c3f64b616c5b9ea935f21fc3efad9b75bf"
  ],
  "author": {
    "name": "xonaman",
    "email": "xonaman738@gmail.com",
    "time": "Thu Oct 08 08:46:34 2026 -0700"
  },
  "committer": {
    "name": "pdfium-scoped@luci-project-accounts.iam.gserviceaccount.com",
    "email": "pdfium-scoped@luci-project-accounts.iam.gserviceaccount.com",
    "time": "Thu Oct 08 08:46:34 2026 -0700"
  },
  "message": "Dereference old-style named destinations in FPDF_GetNamedDest()\n\nFPDF_CountNamedDests() counts every key in the catalog\u0027s old-style\n/Dests dictionary, and FPDF_GetNamedDest() falls back to that dictionary\nfor indices past the /Dests name tree. The fallback used the raw\ndictionary value, so when the value was an indirect reference, which is\nvalid PDF, it was neither an array nor a dictionary. FPDF_GetNamedDest()\nthen returned nullptr without reporting the name, and a document could\nreport named destinations that it could not return by index.\n\nAll other named destination lookups already dereference the value: the\n/Dests name tree lookups by name and by index, and the old-style lookup\nby name. As a result, FPDF_GetNamedDestByName() found indirect old-style\ndestinations that FPDF_GetNamedDest() dropped.\n\nDereference only the value of the matching key, so that the loop does\nnot parse the objects behind the keys it walks past. Direct values are\nunaffected, and a dangling reference resolves to nothing, so\nFPDF_GetNamedDest() returns nullptr for it.\n\nAdd a named_dests_old_style_indirect.pdf fixture whose old-style /Dests\nvalues are all indirect: a destination array, a destination dictionary\nwith a /D array, and a dangling reference. The new embedder test checks\nthat FPDF_GetNamedDest() returns the same destinations as\nFPDF_GetNamedDestByName() along with their names, that those\ndestinations are for the expected pages, and that the dangling entry\ngives neither a destination nor a name.\n\nAn alternative would be to expose GetNamedDestFromObject() from\ncpdf_nametree.cpp through a new CPDF_NameTree static for the old-style\nlookup by index. This change keeps the fix local instead.\n\nFound while working on the pdfium-native Node.js binding.\n\nChange-Id: I380f9b07dbe1bbc680e3c5ae4a21f161a1d554fa\nReviewed-on: https://pdfium-review.googlesource.com/c/pdfium/+/159090\nReviewed-by: Lei Zhang \u003cthestig@chromium.org\u003e\nReviewed-by: Tom Sepez \u003ctsepez@chromium.org\u003e\nCommit-Queue: Tom Sepez \u003ctsepez@chromium.org\u003e\n",
  "tree_diff": [
    {
      "type": "modify",
      "old_id": "1c4a7026d8203d6d6e3fc221237dd94679521fe7",
      "old_mode": 33188,
      "old_path": "fpdfsdk/fpdf_view.cpp",
      "new_id": "93d1308c48703b59f872ebd372277d3de383ea63",
      "new_mode": 33188,
      "new_path": "fpdfsdk/fpdf_view.cpp"
    },
    {
      "type": "modify",
      "old_id": "bf0f45988f4b24499d8209caab41a007326d81eb",
      "old_mode": 33188,
      "old_path": "fpdfsdk/fpdf_view_embeddertest.cpp",
      "new_id": "6a85d9f57aff8ac605cae49d648ad3ef1c1fd131",
      "new_mode": 33188,
      "new_path": "fpdfsdk/fpdf_view_embeddertest.cpp"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "80dcfb5239dd4f48f2ccdf1eee3b1c88fd799ecf",
      "new_mode": 33188,
      "new_path": "testing/resources/named_dests_old_style_indirect.in"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "38eea82eaed22e4fc6c5e70a5b046ae28b854434",
      "new_mode": 33188,
      "new_path": "testing/resources/named_dests_old_style_indirect.pdf"
    }
  ]
}
