# NousResearch/hermes-agent · Fix resource leak and double socket close in tools

## Open now

- Nothing open on GitHub.

These entries all address the same issue: a resource leak and double socket close bug in the code execution tool. The members appear to be duplicates or near-duplicates of the same fix.

## TL;DR

- 5 member(s): 0 open issue(s), 1 closed issue(s), 0 open PR(s), 1 merged PR(s), 3 PR(s) closed without merging.
- A fix was merged to main in PR #2381. Verify it addresses your case.
- **Recommended:** read PR #2381 (and any competing PRs below) before filing. Confirm the merged change covers your symptom.

## Maintainer resolution verdict

- Internal-tracker verdict over this cluster's issue members: `resolved` · deciding PR(s): `pr-2381`. This is distinct from the fix status above. Weigh it yourself.

## How this cluster was grouped

- Link evidence (`STRUCTURAL_SPANNING`): every member is connected by structural evidence: shared changed files, or a closing/superseded reference.
- Pairwise link density `0.40`: the share of member pairs that carry a link, counting a structural link in full and a relevance-only link at 0.36. `1.00` means every pair is linked.

## Closed / duplicate issues

- #2136: fix(tools): resource leak and double socket close in code_execution_tool

## Prior & competing PRs

- **#2291: fix(tools): resource leak and double socket close in code_execution_tool**. closed without merge · fix tier `suggested`
  - maintainer direction: category `implemented_elsewhere`; implication `superseded`
  - _suggested-tier fix detail withheld; re-request with `?tier=all` to include it._
- **#2381: fix(tools): resource leak and double socket close in code_execution_tool**. merged to main · fix tier `verified`
  - maintainer direction: category `merged`; implication `superseded`
  - files: `tools/code_execution_tool.py`
  - fix hunks:
  - `tools/code_execution_tool.py`

    ```diff
    @@ -300,16 +300,16 @@ def _rpc_server_loop(
                     # their status prints don't leak into the CLI spinner.
                     try:
                         _real_stdout, _real_stderr = sys.stdout, sys.stderr
    -                    sys.stdout = open(os.devnull, "w")
    -                    sys.stderr = open(os.devnull, "w")
    +                    devnull = open(os.devnull, "w")
                         try:
    +                        sys.stdout = devnull
    +                        sys.stderr = devnull
                             result = handle_function_call(
                                 tool_name, tool_args, task_id=task_id
                             )
                         finally:
    -                        sys.stdout.close()
    -                        sys.stderr.close()
                             sys.stdout, sys.stderr = _real_stdout, _real_stderr
    +                        devnull.close()
                     except Exception as exc:
                         logger.error("Tool call failed in sandbox: %s", exc, exc_info=True)
                         result = json.dumps({"error": str(exc)})
    ```

    ```diff
    @@ -574,6 +574,7 @@ def _drain_head_tail(pipe, head_chunks, tail_chunks, head_bytes, tail_bytes, tot
     
             # Wait for RPC thread to finish
             server_sock.close()  # break accept() so thread exits promptly
    +        server_sock = None  # prevent double close in finally
             rpc_thread.join(timeout=3)
     
             # Build response
    ```
- **#2140: fix(tools): resource leak and double socket close in code_execution_tool**. closed without merge
  - maintainer direction: category `merged_via`; implication `superseded`; refs `#2381`, `#2250`
- **#2250: fix(tools): fix resource leak and double socket close in code_execution_tool**. closed without merge
  - maintainer direction: category `merged_via`; implication `superseded`; refs `#2381`

## Fix status

- Merged to main in PR #2381 (cited above). No release data is tracked. Verify downstream.
- Fix last verified (merged) `2026-03-21`. This confirmation is old and may be out of date (a revert/reopen would not have invalidated it here); re-verify.
- Subsystem: `agent`
