Repository navigation
Commit ea5a3fc
authored
fix(deps): bump sqlparse to 0.6.0 and close pre/post-run subprocess transports (#120)
* fix(deps): bump sqlparse 0.5.5 -> 0.6.0 to clear the pip-audit gate
`pip-audit` is a Required check and currently fails on every PR against this
repo, main included: sqlparse 0.5.5 accumulated four advisories after main's
last green run, so the gate went red without a single line of code changing.
Two of them are quadratic-blowup DoS vectors on the default parse path —
CVE-2026-71491 (`group_comments` is O(n^2) on comment-only input, reached via
`format(sql, strip_comments=True)`) and CVE-2026-54284 (`TokenList.__init__`
materializes `str(self)` per group, making nested grouping O(n*depth); a 2 KB
payload burns ~10s of CPU). Both are fixed in 0.6.0.
sqlparse is transitive, not a direct dependency: it arrives via
uipath-platform 0.1.8 under the optional `uipath` extra, whose constraint is
`sqlparse>=0.5.5` — so 0.6.0 satisfies it and the bump is lockfile-only
(`uv lock --upgrade-package sqlparse`), touching no other package.
Verified with CI's exact invocation against a `--extra dev --extra uipath
--extra codex` sync: "No known vulnerabilities found", exit 0. `make verify`
green on main plus this change: 4,162 tests.
* fix(orchestrator): close pre/post-run subprocess transports so Windows CI stops leaking
The Windows Smoke Test job has failed on every run since 2026-08-17, on every
branch — including one containing nothing but a lockfile bump. It is not caused
by any recent change: it is a latent resource leak that an environment change
(most likely the GitHub Windows runner image) started surfacing reliably.
`_run_command_list` spawns each pre/post-run command with two PIPEs and never
closes the transport. asyncio offers no public way to: `Process` holds it
privately and only releases it on garbage collection. On Windows' Proactor loop
`_ProactorBasePipeTransport.__del__` then emits `ResourceWarning: unclosed
transport` — one per pipe — which a strict test run reports as
`PytestUnraisableExceptionWarning` against whichever test happened to be running
when the GC fired, not against the code that leaked. That is exactly the
observed shape: always two sub-exceptions per report, always attributed to
test_pre_run / test_post_run / test_preservation_mode, with the victim test
varying run to run while the underlying count stays constant.
`_close_subprocess_transport` releases it from a `finally` covering every exit
from the loop body: the normal path, the timeout branch's `continue`, and the
`fail_on_error` raise. Best-effort and idempotent — a second close is a no-op
and errors are swallowed, since releasing a pipe must never become a task
failure. `proc` is bound before the `try` so the spawn-failure path (nothing to
close) is distinguishable.
Verified as far as a POSIX host allows: make verify green (4,162 tests), ruff
clean, pyright 0 errors on this file, and the 63 tests across the three
reporting modules pass. The leak itself cannot be reproduced here — on Unix the
transport is already closing by the time `wait()` returns, so this is a no-op
off Windows and CI is the real test.
`isolation/docker_runner.py:572` has the same shape and is deliberately left
alone: the evidence points at this loop only (two pipes per command matches the
two sub-exceptions exactly, and the docker path is mocked in those tests). If
Windows stays red, that site is the next candidate and reuses this helper.
---------
Co-authored-by: mohsen-uipath <mohsen-uipath@users.noreply.github.com>1 parent 5006c91 commit ea5a3fc
2 files changed
Lines changed: 35 additions & 3 deletions
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
76 | 76 | | |
77 | 77 | | |
78 | 78 | | |
| 79 | + | |
| 80 | + | |
| 81 | + | |
| 82 | + | |
| 83 | + | |
| 84 | + | |
| 85 | + | |
| 86 | + | |
| 87 | + | |
| 88 | + | |
| 89 | + | |
| 90 | + | |
| 91 | + | |
| 92 | + | |
| 93 | + | |
| 94 | + | |
| 95 | + | |
| 96 | + | |
| 97 | + | |
| 98 | + | |
| 99 | + | |
| 100 | + | |
79 | 101 | | |
80 | 102 | | |
81 | 103 | | |
| |||
2172 | 2194 | | |
2173 | 2195 | | |
2174 | 2196 | | |
| 2197 | + | |
| 2198 | + | |
| 2199 | + | |
2175 | 2200 | | |
2176 | 2201 | | |
2177 | 2202 | | |
| |||
2246 | 2271 | | |
2247 | 2272 | | |
2248 | 2273 | | |
| 2274 | + | |
| 2275 | + | |
| 2276 | + | |
| 2277 | + | |
| 2278 | + | |
| 2279 | + | |
| 2280 | + | |
2249 | 2281 | | |
2250 | 2282 | | |
2251 | 2283 | | |
| |||
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.
0 commit comments