diff --git a/.github/workflows/codeql.yml b/.github/workflows/codeql.yml index 7d48a69d999..7f313586aff 100644 --- a/.github/workflows/codeql.yml +++ b/.github/workflows/codeql.yml @@ -29,17 +29,17 @@ jobs: uses: actions/checkout@v7 - name: Initialize CodeQL - uses: github/codeql-action/init@v4.37.7 + uses: github/codeql-action/init@v4.37.8 with: languages: ${{ matrix.language }} config-file: ./.github/codeql.yml queries: +security-and-quality - name: Autobuild - uses: github/codeql-action/autobuild@v4.37.7 + uses: github/codeql-action/autobuild@v4.37.8 if: ${{ matrix.language == 'python' || matrix.language == 'javascript' }} - name: Perform CodeQL Analysis - uses: github/codeql-action/analyze@v4.37.7 + uses: github/codeql-action/analyze@v4.37.8 with: category: "/language:${{ matrix.language }}" diff --git a/requirements/base-ft.txt b/requirements/base-ft.txt index fe5570f0526..4e243c86ed1 100644 --- a/requirements/base-ft.txt +++ b/requirements/base-ft.txt @@ -26,7 +26,7 @@ frozenlist==1.8.0 # via # -r requirements/runtime-deps.in # aiosignal -gunicorn==26.0.0 +gunicorn==26.1.0 # via -r requirements/base-ft.in idna==3.19 # via yarl @@ -34,8 +34,6 @@ multidict==6.7.1 # via # -r requirements/runtime-deps.in # yarl -packaging==26.3 - # via gunicorn propcache==0.5.2 # via # -r requirements/runtime-deps.in diff --git a/requirements/base.txt b/requirements/base.txt index 61a93ad1e99..14b31ce18ad 100644 --- a/requirements/base.txt +++ b/requirements/base.txt @@ -26,7 +26,7 @@ frozenlist==1.8.0 # via # -r requirements/runtime-deps.in # aiosignal -gunicorn==26.0.0 +gunicorn==26.1.0 # via -r requirements/base.in idna==3.19 # via yarl @@ -34,8 +34,6 @@ multidict==6.7.1 # via # -r requirements/runtime-deps.in # yarl -packaging==26.3 - # via gunicorn propcache==0.5.2 # via # -r requirements/runtime-deps.in diff --git a/requirements/constraints.txt b/requirements/constraints.txt index f448d8523db..09e5be9e735 100644 --- a/requirements/constraints.txt +++ b/requirements/constraints.txt @@ -43,7 +43,7 @@ backports-zstd==1.3.0 ; implementation_name == "cpython" and python_version < "3 # via # -r requirements/lint.in # -r requirements/runtime-deps.in -blockbuster==1.5.26 +blockbuster==1.5.27 # via # -r requirements/lint.in # -r requirements/test-common.in @@ -100,7 +100,7 @@ frozenlist==1.8.0 # -r requirements/runtime-deps.in # aiohttp # aiosignal -gunicorn==26.0.0 +gunicorn==26.1.0 # via -r requirements/base.in identify==2.6.19 # via pre-commit @@ -155,7 +155,6 @@ nodeenv==1.10.0 packaging==26.3 # via # build - # gunicorn # pytest # sphinx # wheel diff --git a/requirements/dev.txt b/requirements/dev.txt index 134d015d456..f2ce934e1b7 100644 --- a/requirements/dev.txt +++ b/requirements/dev.txt @@ -43,7 +43,7 @@ backports-zstd==1.3.0 ; platform_python_implementation == "CPython" and python_v # via # -r requirements/lint.in # -r requirements/runtime-deps.in -blockbuster==1.5.26 +blockbuster==1.5.27 # via # -r requirements/lint.in # -r requirements/test-common.in @@ -98,7 +98,7 @@ frozenlist==1.8.0 # -r requirements/runtime-deps.in # aiohttp # aiosignal -gunicorn==26.0.0 +gunicorn==26.1.0 # via -r requirements/base.in identify==2.6.19 # via pre-commit @@ -152,7 +152,6 @@ nodeenv==1.10.0 packaging==26.3 # via # build - # gunicorn # pytest # sphinx # wheel diff --git a/requirements/lint.txt b/requirements/lint.txt index 856b434a442..5e6abb9d85f 100644 --- a/requirements/lint.txt +++ b/requirements/lint.txt @@ -26,7 +26,7 @@ backports-asyncio-runner==1.2.0 # via pytest-asyncio backports-zstd==1.3.0 ; implementation_name == "cpython" and python_version < "3.14" # via -r requirements/lint.in -blockbuster==1.5.26 +blockbuster==1.5.27 # via -r requirements/lint.in cffi==2.1.1 # via diff --git a/requirements/test-common.txt b/requirements/test-common.txt index 7d6c54c83b0..4070c75cc96 100644 --- a/requirements/test-common.txt +++ b/requirements/test-common.txt @@ -18,7 +18,7 @@ attrs==26.1.0 # via aiohttp backports-asyncio-runner==1.2.0 # via pytest-asyncio -blockbuster==1.5.26 +blockbuster==1.5.27 # via -r requirements/test-common.in cffi==2.1.1 # via cryptography diff --git a/requirements/test-ft.txt b/requirements/test-ft.txt index 4474ecdecdd..071ca517aa8 100644 --- a/requirements/test-ft.txt +++ b/requirements/test-ft.txt @@ -30,7 +30,7 @@ backports-asyncio-runner==1.2.0 # via pytest-asyncio backports-zstd==1.3.0 ; platform_python_implementation == "CPython" and python_version < "3.14" and sys_platform != "android" and sys_platform != "ios" # via -r requirements/runtime-deps.in -blockbuster==1.5.26 +blockbuster==1.5.27 # via -r requirements/test-common.in brotli==1.2.0 ; platform_python_implementation == "CPython" and sys_platform != "android" and sys_platform != "ios" # via -r requirements/runtime-deps.in @@ -59,7 +59,7 @@ frozenlist==1.8.0 # -r requirements/runtime-deps.in # aiohttp # aiosignal -gunicorn==26.0.0 +gunicorn==26.1.0 # via -r requirements/base-ft.in idna==3.19 # via @@ -85,9 +85,7 @@ mypy==2.1.0 ; implementation_name == "cpython" mypy-extensions==1.1.0 # via mypy packaging==26.3 - # via - # gunicorn - # pytest + # via pytest pathspec==1.1.1 # via mypy pkgconfig==1.6.0 diff --git a/requirements/test-mobile.txt b/requirements/test-mobile.txt index b5397120739..5116d51f110 100644 --- a/requirements/test-mobile.txt +++ b/requirements/test-mobile.txt @@ -47,7 +47,7 @@ frozenlist==1.8.0 # -r requirements/runtime-deps.in # aiohttp # aiosignal -gunicorn==26.0.0 +gunicorn==26.1.0 # via -r requirements/base-ft.in idna==3.19 # via yarl @@ -59,9 +59,7 @@ multidict==6.7.1 # aiohttp # yarl packaging==26.3 - # via - # gunicorn - # pytest + # via pytest pkgconfig==1.6.0 # via -r requirements/test-common-base.in pluggy==1.6.0 diff --git a/requirements/test.txt b/requirements/test.txt index 2f21bd246c9..ff2303ad5eb 100644 --- a/requirements/test.txt +++ b/requirements/test.txt @@ -30,7 +30,7 @@ backports-asyncio-runner==1.2.0 # via pytest-asyncio backports-zstd==1.3.0 ; platform_python_implementation == "CPython" and python_version < "3.14" and sys_platform != "android" and sys_platform != "ios" # via -r requirements/runtime-deps.in -blockbuster==1.5.26 +blockbuster==1.5.27 # via -r requirements/test-common.in brotli==1.2.0 ; platform_python_implementation == "CPython" and sys_platform != "android" and sys_platform != "ios" # via -r requirements/runtime-deps.in @@ -59,7 +59,7 @@ frozenlist==1.8.0 # -r requirements/runtime-deps.in # aiohttp # aiosignal -gunicorn==26.0.0 +gunicorn==26.1.0 # via -r requirements/base.in idna==3.19 # via @@ -85,9 +85,7 @@ mypy==2.1.0 ; implementation_name == "cpython" mypy-extensions==1.1.0 # via mypy packaging==26.3 - # via - # gunicorn - # pytest + # via pytest pathspec==1.1.1 # via mypy pkgconfig==1.6.0 diff --git a/tests/test_web_functional.py b/tests/test_web_functional.py index c834c388a06..1519a2d8aa6 100644 --- a/tests/test_web_functional.py +++ b/tests/test_web_functional.py @@ -2450,7 +2450,9 @@ async def handler(request: web.Request) -> NoReturn: assert resp.status == 413 -@pytest.mark.skipif(not os.path.isdir("/dev/fd"), reason="needs /dev/fd to count fds") +@pytest.mark.skipif( + not os.path.isdir("/proc/self/fd"), reason="needs /proc/self/fd to identify fds" +) @pytest.mark.parametrize( ("parts", "part_body", "expected_fds"), ( @@ -2464,10 +2466,22 @@ async def test_post_file_fields_descriptor_cost( ) -> None: """Only a part past the spool size may cost a descriptor.""" + def deleted_file_fds() -> set[tuple[str, str]]: + """(fd, symlink target) pairs for open fds backed by deleted files.""" + fds = set() + for name in os.listdir("/proc/self/fd"): + try: + target = os.readlink(f"/proc/self/fd/{name}") + except OSError: + continue # closed between listdir and readlink + if target.endswith("(deleted)"): + fds.add((name, target)) + return fds + async def handler(request: web.Request) -> web.Response: - before = set(await asyncio.to_thread(os.listdir, "/dev/fd")) + before = await asyncio.to_thread(deleted_file_fds) data = await request.post() - after = set(await asyncio.to_thread(os.listdir, "/dev/fd")) + after = await asyncio.to_thread(deleted_file_fds) assert len(data) == parts return web.Response(text=str(len(after - before)))