Skip to content

Conversation

@watilde
Copy link
Contributor

@watilde watilde commented Jan 2, 2026

On some Linux environments (e.g. WSL), execvp may return EACCES instead of ENOENT when a command is not found in PATH, if it encounters permission errors during the search. This change adds a check to verify if the file actually exists in PATH when EACCES is received for a command without path separators. If not found, the error is normalized to ENOENT.

refs: https://gist.github.com/watilde/db38ff0335834a32a6eebaa6b3373b8b

Once this is merged, I plan to add a CI setup for the WSL Distribution, which I believe will have a fair amount of users.

@nodejs-github-bot nodejs-github-bot added child_process Issues and PRs related to the child_process subsystem. needs-ci PRs that need a full CI run. labels Jan 2, 2026
On some Linux environments (e.g. WSL), execvp may return EACCES instead
of ENOENT when a command is not found in PATH, if it encounters
permission errors during the search.

This change adds a check to verify if the file actually exists in PATH
when EACCES is received for a command without path separators. If not
found, the error is normalized to ENOENT.
Adds a test case that places inaccessible directories and files in PATH
to verify that spawn correctly returns ENOENT for non-existent commands,
ensuring robustness of the EACCES handling fix.
@codecov
Copy link

codecov bot commented Jan 2, 2026

Codecov Report

❌ Patch coverage is 94.28571% with 2 lines in your changes missing coverage. Please review.
✅ Project coverage is 88.53%. Comparing base (0457bfe) to head (1af02a1).
⚠️ Report is 3 commits behind head on main.

Files with missing lines Patch % Lines
lib/internal/child_process.js 94.28% 2 Missing ⚠️
Additional details and impacted files
@@            Coverage Diff             @@
##             main   #61253      +/-   ##
==========================================
- Coverage   88.53%   88.53%   -0.01%     
==========================================
  Files         704      704              
  Lines      208736   208775      +39     
  Branches    40274    40288      +14     
==========================================
+ Hits       184810   184836      +26     
- Misses      15944    15957      +13     
  Partials     7982     7982              
Files with missing lines Coverage Δ
lib/internal/child_process.js 95.04% <94.28%> (-0.04%) ⬇️

... and 29 files with indirect coverage changes

🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.
  • 📦 JS Bundle Analysis: Save yourself from yourself by tracking and limiting bundle sizes in JS merges.

- Use ||= operator in lib/internal/child_process.js
- Add descriptive comment to empty catch block in test
- Add test cases for non-executable files, empty PATH entries, and
  missing PATH in envPairs to cover verifyENOENT logic.

Fixes: https://github.com/nodejs/node/issues/XXXXX (if applicable)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

child_process Issues and PRs related to the child_process subsystem. needs-ci PRs that need a full CI run.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants