Skip to content

build(deps): bump pypdf from 6.15.0 to 6.16.1 in /worker - #156

Closed
dependabot[bot] wants to merge 4 commits into
mainfrom
dependabot/uv/worker/pypdf-6.16.1
Closed

dependabot[bot] wants to merge 4 commits into
mainfrom
dependabot/uv/worker/pypdf-6.16.1

Conversation

@dependabot

@dependabot dependabot Bot commented on behalf of github Sep 2, 2026

Copy link
Copy Markdown
Contributor

Bumps pypdf from 6.15.0 to 6.16.1.

Release notes

Sourced from pypdf's releases.

Version 6.16.1, 2026-08-14

What's new

Security (SEC)

Full Changelog

Version 6.16.0, 2026-08-13

What's new

Security (SEC)

New Features (ENH)

  • AppearanceStream: Allow arbitrary rotations and apply rotations for annotation appearance streams (#3917) by @​PJBrs
  • AppearanceStream: Consider more encodings for Type1 core fonts (#3905) by @​PJBrs

Performance Improvements (PI)

  • Build /ToUnicode source-code bytes directly in parse_bfrange (#3952) by @​Anai-Guo

Bug Fixes (BUG)

Robustness (ROB)

  • AppearanceStream: Only escape parentheses for 8-bit fonts (#3961) by @​PJBrs
  • Recover the trailer from a cross-reference stream when rebuilding the xref (#3950) by @​Anai-Guo

Maintenance (MAINT)

  • Deduplicate CatalogAttributes and CatalogDictionary (#3940) by @​j-t-1

Code Style (STY)

Full Changelog

Changelog

Sourced from pypdf's changelog.

Version 6.16.1, 2026-08-14

Security (SEC)

  • Limit iterations for outline retrieval and XForm text extraction (#3966)

Full Changelog

Version 6.16.0, 2026-08-13

Security (SEC)

  • Detect cycles in TreeObject.insert_child (#3964)

New Features (ENH)

  • AppearanceStream: Allow arbitrary rotations and apply rotations for annotation appearance streams (#3917)
  • AppearanceStream: Consider more encodings for Type1 core fonts (#3905)

Performance Improvements (PI)

  • Build /ToUnicode source-code bytes directly in parse_bfrange (#3952)

Bug Fixes (BUG)

  • Preserve internal Link annotations when appending/merging (#3953) (#3954)
  • Fix false inline image end markers (#3922)
  • Reject typeless non-page /Kids entries in strict mode (#3955)
  • Apply character spacing (Tc) per glyph in layout-mode extraction (#3951)
  • Keep the Adobe CMYK inversion when an explicit /Decode is present (#3943)

Robustness (ROB)

  • AppearanceStream: Only escape parentheses for 8-bit fonts (#3961)
  • Recover the trailer from a cross-reference stream when rebuilding the xref (#3950)

Maintenance (MAINT)

  • Deduplicate CatalogAttributes and CatalogDictionary (#3940)

Code Style (STY)

  • Type pages as a Sequence rather than a list (#3957)

Full Changelog

Commits
  • 1bce7a7 REL: 6.16.1
  • d91ab70 SEC: Limit iterations for outline retrieval and XForm text extraction (#3966)
  • 2b60c99 REL: 6.16.0
  • c9ba557 SEC: Detect cycles in TreeObject.insert_child (#3964)
  • c8e1c72 BUG: Always define PdfWriter._reader (#3960)
  • 3a0f355 ROB: Detect cyclic pages in _get_page_in_node (#3962)
  • 20512f4 ROB: AppearanceStream: Only escape parentheses for 8-bit fonts (#3961)
  • 34ccd14 MAINT: Deduplicate CatalogAttributes and CatalogDictionary (#3940)
  • 5b8f19e ENH: AppearanceStream: Allow arbitrary rotations and apply rotations for anno...
  • 53bfbc6 PI: Build /ToUnicode source-code bytes directly in parse_bfrange (#3952)
  • Additional commits viewable in compare view

Dependabot compatibility score

Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting @dependabot rebase.


Dependabot commands and options

You can trigger Dependabot actions by commenting on this PR:

  • @dependabot rebase will rebase this PR
  • @dependabot recreate will recreate this PR, overwriting any edits that have been made to it
  • @dependabot show <dependency name> ignore conditions will show all of the ignore conditions of the specified dependency
  • @dependabot ignore this major version will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)
  • @dependabot ignore this minor version will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)
  • @dependabot ignore this dependency will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
    You can disable automated security fix PRs for this repo from the Security Alerts page.

Bumps [pypdf](https://github.com/py-pdf/pypdf) from 6.15.0 to 6.16.1.
- [Release notes](https://github.com/py-pdf/pypdf/releases)
- [Changelog](https://github.com/py-pdf/pypdf/blob/main/CHANGELOG.md)
- [Commits](py-pdf/pypdf@6.15.0...6.16.1)

---
updated-dependencies:
- dependency-name: pypdf
  dependency-version: 6.16.1
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
@dependabot dependabot Bot added dependencies Pull requests that update a dependency file python:uv Pull requests that update python:uv code labels Sep 2, 2026
@dependabot dependabot Bot added dependencies Pull requests that update a dependency file python:uv Pull requests that update python:uv code labels Sep 2, 2026
@sun-970

sun-970 commented Sep 2, 2026

Copy link
Copy Markdown
Contributor

建议先跑一遍测试,确认 pypdf 升级后没有兼容性问题再合并。

@waterbro-8
waterbro-8 self-requested a review as a code owner September 4, 2026 07:19
@waterbro-8

Copy link
Copy Markdown
Collaborator

@dependabot rebase

@dependabot @github

dependabot Bot commented on behalf of github Sep 6, 2026

Copy link
Copy Markdown
Contributor Author

Looks like this PR has been edited by someone other than Dependabot. That means Dependabot can't rebase it - sorry!

If you're happy for Dependabot to recreate it from scratch, overwriting any edits, you can request @dependabot recreate.

@PeterGuy326 PeterGuy326 left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Independent review: the diff is limited to the pypdf requirement and uv lockfile. The lockfile remains internally consistent (uv lock --check passed locally), the Worker CI is green, and the upstream release notes include the intended PDF robustness/security fixes. Approving for squash merge.

@PeterGuy326
PeterGuy326 enabled auto-merge (squash) September 6, 2026 03:12
@waterbro-8

Copy link
Copy Markdown
Collaborator

Not a review vote and not an acceptance. I cannot cast a usable approving review on this PR: the two Merge branch 'main' commits on this head (f66fba77712d, 70a9705738f7) were authored by my own account — they are Update branch clicks I made on 09-04 and 09-06 — so under require_last_push_approval=true my ticket is mechanically void here. Everything below is verification output, offered to whoever can sign.

Status (live read, 2026-09-08, re-read before posting)

head 70a9705738f786eb75300e0cee9155bda5b5a633, 3 commits, +53/−53, 2 files. 15/15 checks completed success on this exact head, attempt 1. One review: PeterGuy326 APPROVED @ 09-06T03:12:40Z, on this head. requested_reviewers = [Bindy-lbb, waterbro-8].

This changed since I started the review: mergeable_state now reads behind, not blocked — main moved to 2986fe38175f ("ci: enable free security baseline", which adds only .github/workflows/bytefolk-scorecard.yml and bytefolk-security.yml). It touches neither worker/pyproject.toml nor worker/uv.lock, so an update-branch here is conflict-free.

One ordering caveat, because it is easy to lose a ticket by accident. PeterGuy326's APPROVED is currently in force: it was submitted 2026-09-06T03:12:40Z, i.e. 25 minutes after the head commit (02:47:46Z). Under require_last_push_approval=true an approval only counts if it postdates the latest push, so clicking Update branch — even though it is conflict-free — drops this thread to zero valid tickets. And the clicker cannot simply re-sign afterwards: on this org I have two observations where an approval from the person who pushed that head did not clear the block (mem#137 09-04, mem#140 09-07 — both stayed mergeable_state=blocked with my post-push APPROVED on the head). I can't read the rule itself, it lives in an org-level ruleset that needs admin:org, so I am reporting the shape, not the mechanism. If the update happens, the sign-off has to come from someone else, afterwards.

I have one verified instance of the dismissal half of that: on mem#140 my own push produced a review_dismissed timeline event at 2026-09-07T01:28:30Z (actor waterbro-8), and the APPROVED I had submitted on 09-01 against head b9226a6792 now reads DISMISSED. One push, one ticket gone.

The bump itself is sound, and CI covers it at execution level

  • Both advisory fixes land in exactly 6.16.1 — GHSA-23w6-3w8w-8484 (long runtime/memory when retrieving outlines) and GHSA-763m-79hh-57f2 (same class when extracting XForm content streams); re-read from the advisory DB just now: first_patched_version: 6.16.1 on both. GHSA-jp53-mhqp-8xcg closes in 6.16.0, which this floor also pulls in. Upstream's own 6.16.1 notes name the same two surfaces: the release's only Security (SEC) entry is "Limit iterations for outline retrieval and XForm text extraction (#3966)".
  • pypdf is not a phantom dependency: worker/mem_worker/processors/pdf.py:79 runs PdfReader(BytesIO(file.data)) on user-uploaded files. That is the untrusted-input boundary these advisories are written against.
  • The Worker leg installs from this lock.github/workflows/ci.yml:193 runs uv sync --frozen --extra test --extra dev with UV_FROZEN: "1" (:170) and uv pinned to 0.9.27 (:185-187) on Python 3.11 (:182) — and worker/tests/test_processor_logic.py:457 hand-builds a real single-page PDF (:419) and asserts the extracted text reaches the embedder (:479 r.metadata["page_count"] == 1, then :485 "1800 RMB" in emb.calls[0][0]). So 6.16.1's extraction path was actually executed on the runner, not merely selected. There is a second, non-CI surface with the same shape in scripts/seed_demo_data.sh:491 (its assertion is || true, so don't count it as a gate).

1. The floor is unbounded, and what gets installed is still two upstream SEC releases behind

worker/pyproject.toml:31 now reads pypdf>=6.16.1. The constraint is a floor, but the lock pins 6.16.1 — so merging this as-is is what determines what the Worker actually runs. Since 6.16.1 (uploaded 08-14) upstream has shipped three releases:

  • 6.16.2 (2026-08-23) — bug fixes + robustness only
  • 6.17.0 (2026-09-04) — Security: Limit value for Roman numerals (#4047)
  • 6.18.0 (2026-09-07) — Security: Limit allowed length of indirect object tokens (#4055)

Both SEC entries are the same hardening class as the three advisories this PR exists for (bound a parser input limit), and neither has a GHSA allocated. Re-read just now: advisories?affects=pypdf returns 43 entries, all type: reviewed, and the newest first_patched_version anywhere in that set is 6.16.1. The most recently published one (GHSA-fc8x-2rww-xw9m, 09-02) already patches at 6.15.0, so >=6.16.1 covers everything currently in the DB — which is exactly the point: no security alert is going to push 6.17.0 or 6.18.0, and dependabot's own PR stream is not obligated to. Latest on PyPI right now is 6.18.0.

Measured with the CI-pinned uv 0.9.27, starting from this head's own pyproject.toml + uv.lock:

  • A plain uv lock leaves it at 6.16.1 and produces 0 diff lines — i.e. this PR's lock is internally consistent with its manifest, and uv sync --frozen will never complain about it. That is the correct shape for a dependabot bump.
  • uv lock --upgrade-package pypdf moves it 6.16.1 → 6.18.0 in 56 lock lines, of which 4 are pypdf and the other 52 are the marker renormalisation in point 2. No other package's version changes — the two numpy entries (2.4.6, 2.5.1) are present on both sides; those diff lines are reordering plus marker text.

So getting to 6.18.0 is one deliberate command, not a re-resolution gamble. It is also where any hand re-lock would end up anyway: uv resolves the newest release satisfying a floor, not the floor. Starting from main's lock with only the >=4.0>=6.16.1 edit in the manifest and no --upgrade, the pinned tool jumps to 6.18.0 too (76 lines, 6 of them pypdf). Dependabot sits at 6.16.1 because that is what was newest when it resolved, on 09-02.

Suggest taking the floor as written and letting the lock go to 6.18.0 in this PR — one PR, one CI run, and the installed pin lands on what upstream currently ships. If 6.16.1 merges instead, the installed pin stays two SEC hardenings short until someone re-locks by hand, because no alert is going to schedule that for us.

One migration detail checked because it is the only thing that would make 6.18.0 more than a version bump: 6.18.0 reworks how default-limit overwrites are expressed (DEP: Rework configuration value handling #4044, with a apply_configuration / overwrite_configuration migration note). Nothing in this repo touches that surfacegrep over the whole main tree for pypdf touchpoints gives 3 files (worker/pyproject.toml, worker/mem_worker/processors/pdf.py, scripts/seed_demo_data.sh) and zero hits for overwrite_configuration / apply_configuration / disable_legacy_handling / pypdf.constants. Legacy handling is retained upstream anyway. So 6.18.0 is safe here at grep level; the Worker test leg would still be the real proof.

2. The other 98 lock lines are uv's own doing, not dependabot's — and I retract my first guess

My first hypothesis was that a newer uv than the repo pin had written that lock. I disproved it with the pinned tool. In a sanitized environment (no mirror/proxy env vars — that detail matters, see below) with uv 0.9.27:

  • Re-locking main's own worker/pyproject.toml against main's committed worker/uv.lock returns 0 diff lines — the pinned tool reproduces that lock exactly.
  • Re-locking this head's pyproject.toml + uv.lock the same way also returns 0 diff lines, and it stays at 6.16.1. So the tool version is not what wrote those 98 lines, and this PR's lock is exactly what uv 0.9.27 produces from this PR's manifest.
  • What does produce them is a resolve in which pypdf actually moves. Both re-locks quoted in point 1 are instances of this (56 lines / 4 pypdf, and 76 lines / 6 pypdf), and in each the non-pypdf lines are the same class of churn — the python_full_version >= '3.15' and sys_platform == 'darwin' fork marker hopping between torch 2.13.0 and 2.13.0+cpu (likewise torchvision 0.28.0 / +cpu), python_full_version narrowing dropping off numpy / scipy / tifffile entries, and the resolution-markers list reordering.

This PR's lock diff is 104 lines (52 removed + 52 added; the 53rd pair is the pyproject.toml specifier). Of those 104, 6 are pypdf (specifier + sdist + wheel, each side) and 98 are that renormalisation. So there is no "cleaner" diff available to ask for: a plain uv lock on either side costs nothing, but any resolve that moves pypdf pays those lines, and every future pypdf or uv bump on this repo will re-diff them. Asking the author to shave it would just cost a cycle.

The env pitfall, so nobody else loses time on it: the first attempt inherited UV_DEFAULT_INDEX / UV_PYTHON_INSTALL_MIRROR pointing at mirrors and rewrote 3212 URL lines, and uv lock --locked then claimed both main's and head's lock were stale. Re-running with env -i PATH=/usr/bin:/bin HOME=<clean> XDG_CACHE_HOME=<clean> is what made the 0-diff reproduction possible. A "the lock is out of date" verdict obtained through a mirror-configured uv is not evidence.

Minor, and explicitly not a defect of this PR

darwin + Python ≥ 3.15 is unsatisfiable in both locks. Counting the wheel URLs in the committed head/main locks with tomllib: torch 2.13.0 has 5 wheels, all macOS (cp311cp314t), and no sdist; torch 2.13.0+cpu has 27 wheels, 0 macOS, and no sdist (torchvision 0.28.0 → 5 all-macOS; 0.28.0+cpu → 15, 0 macOS). The churn moves that fork marker from the plain entry onto +cpu, which looks alarming — but since the plain entry tops out at cp314 and offers no sdist, the ≥ 3.15 / darwin fork had no satisfiable candidate on either side of this diff. Nothing regressed here. Note also that no CI job ever installs --extra clip (the only --extra line under .github/workflows/ is ci.yml:193, test + dev), so that marker geometry has zero CI coverage in either direction. Not a request change — I am writing it down only so the next reader who notices the +cpu fork does not have to re-derive that it is pre-existing. If it is ever acted on, it belongs on the clip extra.

What I did not do

Did not approve/request-changes, did not merge, did not close, did not touch any ref, did not click Update branch. Deciding whether to fold 6.18.0 into this PR is the call of whoever owns the release cadence, not mine.

@sun-970

sun-970 commented Sep 10, 2026

Copy link
Copy Markdown
Contributor

Superseded by #188 which raises the pypdf floor to 6.18.0 (covers this 6.16.1 bump plus additional SEC fixes #4047/#4055). Closing to avoid duplicate review.

@sun-970

sun-970 commented Sep 10, 2026

Copy link
Copy Markdown
Contributor

Superseded by #188 (raises pypdf floor to >=6.18.0).

@PeterGuy326

Copy link
Copy Markdown
Collaborator

Holding this PR — not closing it, and the existing approval stands.

Why it is on hold

#188 targets the same two files (worker/pyproject.toml + worker/uv.lock) from the same pypdf>=4.0 base and pins 6.18.0, so this PR's diff is a strict subset of that one. The three alerts this PR clears — GHSA-jp53-mhqp-8xcg, GHSA-763m-79hh-57f2, GHSA-23w6-3w8w-8484 — are cleared identically by 6.18.0, since the newest first_patched_version anywhere in the 43 reviewed pypdf advisories is 6.16.1.

6.18.0 additionally carries two upstream Security (SEC) releases that no advisory will ever schedule, because neither has a GHSA:

  • 6.17.0 — Limit value for Roman numerals (#4047)
  • 6.18.0 — Limit allowed length of indirect object tokens (#4055)

Both bound an unbounded parser input, and the surface is the untrusted one: worker/mem_worker/processors/pdf.py:79 runs PdfReader(BytesIO(file.data)) on user-uploaded files. That reasoning is recorded on #187, which now carries status:ready.

So merging this first would mean immediately needing #188's change anyway, on a manifest whose stated floor would then be >=6.16.1 while the lock sat at whatever uv resolved next.

What happens next

#188 has been marked ready for review and queued. Once it lands, this PR gets closed as subsumed, with the alert coverage confirmed against the resulting main.

If #188 is declined — on the release-cadence question of whether 6.17.0/6.18.0 belong in this repo's Worker at all, which is a legitimate call for the owner to make — then this PR proceeds on PeterGuy326's existing approval of head 8ce04dd7 and nothing is lost by the wait.

To be explicit about what is not happening: no ref on this PR has been moved, no approval dismissed, and this is not a judgement that the Dependabot PR was wrong. It was correct when opened. #188 simply reaches further.

PeterGuy326 added a commit that referenced this pull request Sep 10, 2026
### Not a review vote, and not an acceptance

I am the author of this branch, so under this org's `require_code_owner`
+
`require_last_push_approval` configuration my own ticket cannot be the
one that
clears it. Nothing here asks for a merge, a close, a label, or a tag.
The
commitment is only: here is a change, here is what I measured.

Supersedes nothing by itself: **#156 is a separate, still-valid
Dependabot PR.**
See *Sequencing* below.

### What changes

Two files, +39/−39:

- `worker/pyproject.toml:31` — `"pypdf>=4.0"` → `"pypdf>=6.18.0"`
- `worker/uv.lock` — `pypdf 6.15.0 → 6.18.0`, nothing else moves

That is the whole diff. No test, no docs, no CI file, no `CHANGELOG.md`
entry:
`grep -i 'pypdf\|numpy\|torch\|dependabot' CHANGELOG.md` on `main`
returns
**zero** dependency-bump entries across its 381 lines, and #156 is 2
files too,
so an entry here would be inventing a convention.

### Why the floor is written `>=6.18.0` and not `>=6.16.1`

Three open Dependabot alerts name `pypdf` in this lock — `#71`
(`GHSA-jp53-mhqp-8xcg`, `< 6.16.0`), `#72` (`GHSA-763m-79hh-57f2`, `<
6.16.1`),
`#73` (`GHSA-23w6-3w8w-8484`, `< 6.16.1`). This satisfies all three, the
same as
#156, once it is on the default branch.

It additionally takes two upstream releases that **have no advisory**,
so no
alert will ever schedule them:

- **6.17.0** (2026-09-04) — `Security (SEC): Limit value for Roman
numerals (#4047)`
- **6.18.0** (2026-09-07) — `Security (SEC): Limit allowed length of
indirect object tokens (#4055)`

Re-measured for this PR: `GET /advisories?affects=pypdf` → **43**
entries, all
`type: reviewed`, and the newest `first_patched_version` anywhere in
that set is
**6.16.1**. Both new entries are the same hardening class as the three
above
(bound an unbounded parser input), and the surface is the untrusted one:
`worker/mem_worker/processors/pdf.py:79` runs
`PdfReader(BytesIO(file.data))` on
**user-uploaded** files.

Writing the floor at 6.18.0 rather than letting the lock alone carry it
is the
part that survives a from-scratch resolve. Measured: **uv resolves to
the newest
release satisfying a floor, not to the floor** — `>=6.16.1` re-resolved
today
lands on 6.18.0, and after the next release it would land past it, in a
manifest
whose stated requirement was never 6.18.0.

### Evidence

All of it executed on a tarball of `main @
2986fe3`
whose tree was proved equal to the remote (`.commit.tree.sha`
`f447ca554377e85ba26090d59882b8d4f2b78731` == `git init && git add -A &&
git
write-tree`), with the tool CI pins — uv `0.9.27` (`ci.yml:185-187`) —
in a
sanitized env (no mirror/proxy variables; `uv lock` through a
mirror-configured
uv rewrites thousands of URL lines and its "lock is stale" verdict is
then
worthless).

| # | check | result |
| --- | --- | --- |
| 1 | `uv lock` on the **untouched** tree | **0 diff lines** vs
committed `worker/uv.lock` — the pin is reproducible, so everything
below is about the resolve, not a stale tool |
| 2 | `uv lock` after only the constraint edit | `Updated pypdf v6.15.0
-> v6.18.0`, 76 lock lines |
| 3 | name/version pairs, both locks | 85 packages each, **exactly one**
difference: `pypdf 6.15.0 → 6.18.0` |
| 4 | `uv lock --locked` | `rc=0` — so the Worker leg's `uv sync
--frozen` (`ci.yml:193`, `UV_FROZEN: "1"` at `:170`) accepts it |
| 5 | dist hashes vs the registry | sdist
`ae58b7d93c22c169ffb02c3b06321c45c4f223b4916536568adb57d789d95d01`,
wheel `05b762b77bcb9dcb4a7c91fcf5dded585b25bee7269ab3d3001d7c55fa1b324b`
— byte-identical to `pypi.org/pypi/pypdf/json` |
| 6 | the repo's own fixture (`test_processor_logic.py:419`) extracted
at 6.15.0 / 6.16.1 / 6.18.0 on **Python 3.11** (`ci.yml:182`) |
identical `page_count`, identical `sha256(extracted_text)`
(`46e7c072b2684841…`, 214 chars), `"1800 RMB" in text` true on all
three, malformed input raises the same `PdfStreamError` on all three |
| 7 | 6.18.0's only behavioural change (`DEP: Rework configuration value
handling (#4044)`) | `grep` over the whole tree for
`overwrite_configuration` / `apply_configuration` /
`disable_legacy_handling` / `pypdf.constants` → **0 hits**; `pypdf`
appears in only 3 files (`worker/pyproject.toml`,
`worker/mem_worker/processors/pdf.py`, `scripts/seed_demo_data.sh`) |

Checks 1–4 and 7 are the ones CI cannot shortcut; 6 is the one that says
"the
worker's PDF path behaves the same", and 4 is the one that says "this
lock is
self-consistent". The Worker test leg on the exact head remains the real
proof
of the full pipeline (`test_processor_logic.py:457`) — **that runs in
CI, I did
not run it here**; the local venv has none of the Worker's own
dependencies
installed.

About the diff size: of the 76 changed lock lines, **8 are pypdf**
(specifier,
version, sdist, wheel — each on both sides). The other 68 are uv's
marker
renormalisation: the `python_full_version >= '3.15' and sys_platform ==
'darwin'` fork marker hopping between `torch 2.13.0` and `2.13.0+cpu`
(likewise
`torchvision 0.28.0` / `+cpu`), `python_full_version` narrowing dropping
off
`numpy` / `scipy` / `tifffile`, and the `resolution-markers` list
reordering.
That is not avoidable churn I chose: **a plain `uv lock` on either side
of a pin
costs 0 lines, but any resolve that moves pypdf pays them** — #156's own
`+53/−53` is the same shape. No other package's *version* changes.

### Process: this PR is ahead of its issue's readiness gate

`AGENTS.md` rule 2 says not to implement a material change until its
issue has
acceptance criteria and `status:ready`. Refs #187, which I filed with
the AC
list and reproduction steps for exactly this; it is
`status:needs-triage`, and
`status:ready` is a maintainer's label, not mine to set. So this is a
**draft**,
and undrafting it is the step that should follow that label rather than
precede
it. If triage would rather the change go in behind #156, #187 can simply
wait.

### Sequencing with #156

Both branches touch the same two files, so they will conflict with each
other,
not with `main`.

- If **#156 merges first**: rebase this onto the new `main` — the
manifest line
is a one-token edit and the lock is one `uv lock` with the pinned tool.
I
  offered to do that; it is not something to do unasked.
- If **this merges first**: #156's diff is a strict subset of this one
and its
three alerts are dismissed by this branch instead. **I am not asking for
#156
to be closed** — it has an in-force `APPROVED` from `PeterGuy326` on its
current head and I am not in a position to spend someone else's ticket.
That
call, and the release-cadence call about whether 6.17.0/6.18.0 belong in
this
  repo's Worker at all, is the owner's.

### What I did not do

No review submitted, no vote, no merge, no close, no label change on
anything
except the new issue's own labels, no ref moved on #156, no `Update
branch`
clicked anywhere, no `CHANGELOG.md` edit, no tag, no publish.

Co-authored-by: waterbro-8 <318569545+waterbro-8@users.noreply.github.com>
Co-authored-by: 修雨 <47820304+PeterGuy326@users.noreply.github.com>
@PeterGuy326

Copy link
Copy Markdown
Collaborator

Closing as subsumed by #188, which merged as 55d09b203ba9.

The alert coverage I said I would confirm against the resulting main is confirmed — not by inference but by the Dependabot alert state itself:

Alert GHSA State fixed_at
#71 GHSA-jp53-mhqp-8xcg fixed 2026-09-10T16:25:49Z
#72 GHSA-763m-79hh-57f2 fixed 2026-09-10T16:25:50Z
#73 GHSA-23w6-3w8w-8484 fixed 2026-09-10T16:25:50Z

All three alerts this PR would have cleared are cleared by main today. Zero pypdf alerts remain open in this repository.

What #188 delivered beyond this PR's scope: the manifest floor is >=6.18.0 rather than the lock alone carrying the version, so a from-scratch uv lock cannot resolve below it; plus upstream 6.17.0 (Limit value for Roman numerals) and 6.18.0 (Limit allowed length of indirect object tokens), neither of which has a GHSA and so neither of which any alert would ever have scheduled. Both bound an unbounded parser input on the untrusted path at worker/mem_worker/processors/pdf.py:79.

To be clear about what this closure is not: it is not a judgement that this PR was wrong. It was correct when Dependabot opened it on 2026-09-02, it carried an in-force approval from PeterGuy326 on head 8ce04dd7, and merging it would have been a legitimate outcome. #188 simply reached further, and merging both was impossible because they edit the same two files from the same base.

PeterGuy326's approval was not spent on a merge, and no ref on this branch was moved before closing.

The one remaining dependency gap in this repository is unrelated: three open google.golang.org/grpc alerts on server/go.mod (#74 high, #78 high, #79 medium), tracked on #158.

@dependabot @github

dependabot Bot commented on behalf of github Sep 10, 2026

Copy link
Copy Markdown
Contributor Author

OK, I won't notify you again about this release, but will get in touch when a new version is available. If you'd rather skip all updates until the next major or minor version, let me know by commenting @dependabot ignore this major version or @dependabot ignore this minor version.

If you change your mind, just re-open this PR and I'll resolve any conflicts on it.

@dependabot
dependabot Bot deleted the dependabot/uv/worker/pypdf-6.16.1 branch September 10, 2026 16:30
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

dependencies Pull requests that update a dependency file python:uv Pull requests that update python:uv code

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants