fs: rmSync() reports UV_UNKNOWN with an empty code for unmapped errno values
Les mainteneurs répondent en général sous 1 jour
Personne n'a encore pris cette issue.
Évaluation
- Difficulté
- 3/5
- Temps estimé
- 1-2 jours
- Accessibilité débutants
- 76/100
- Type d'issue
- Bug
- Clarté
- Clairement spécifiée
- Activité
- Active
- Stack technique
- cpp, javascript, nodejs
- Domaine
- operating-systems
Piste de recherche
Lisez src/node_file.cc au niveau de RmSync() et suivez comment le std::error_code de std::filesystem::remove_all() devient une erreur Node.js. Ajoutez une couverture de régression pour un errno non mappé tel que EINVAL, en vérifiant que le code, errno et message renvoyés sont utilisables plutôt que UV_UNKNOWN avec un code vide.
Rédigé par le modèle d'indexation à partir du texte de l'issue.
Description
Version
v26.7.0
Platform
Linux x64
Subsystem
fs / src/node_file.cc
What steps will reproduce the bug?
const fs = require('node:fs');
fs.mkdirSync('a/b', { recursive: true });
try {
fs.rmSync('a/.', { recursive: true, force: true });
} catch (err) {
console.log('code :', JSON.stringify(err.code));
console.log('errno :', err.errno);
console.log('syscall:', err.syscall);
console.log('message:', err.message);
}
Output:
code : ""
errno : -4094
syscall: "rm"
message: , Unknown error: Invalid argument 'a/.'
What is the expected behavior? Why is that the expected behavior?
err.code should be 'EINVAL' and err.errno should be -22. The underlying
failure is a plain EINVAL from rmdir(2), which POSIX requires for a path whose
final component is ..
Every other fs error carries a usable code, and err.code === 'EINVAL' is the
documented way to branch on fs failures, so an empty string breaks ordinary error
handling. The message is also malformed: it begins with , because the empty code
is interpolated into it.
What do you see instead?
errno is -4094 (UV_UNKNOWN) and code is the empty string.
Additional information
This is not specific to EINVAL. RmSync() in src/node_file.cc translates the
std::error_code from std::filesystem::remove_all() with a hardcoded chain that
covers four values:
operation_not_permitted->EPERMdirectory_not_empty->ENOTEMPTYnot_a_directory->ENOTDIRpermission_denied->EACCES(EPERMon Windows)
Anything else falls through to the tail of the function:
std::string message = "Unknown error: " + error.message();
return env->ThrowErrnoException(
UV_UNKNOWN, "rm", message.c_str(), path_c_str);
So the mapping is an allowlist rather than a translation, and any errno outside
those four surfaces as UV_UNKNOWN with an empty code. EINVAL is simply the
one that is easiest to trigger from user code.
The async form is unaffected, because fs.rm() and fsPromises.rm() use the JS
rimraf and report EINVAL correctly.
Noting for context that the dot segment handling in #61958 is being addressed
separately at the JS layer. That change stops a/. from reaching this code path,
but it does not fix the mapping, which stays reachable for other errnos.
- Langage dominant
- JavaScript
- Étoiles
- 122k
- Forks
- 38.4k
- Merge moyen
- 4 j 10 h
- PR mergées (30 j)
- 276
Préparer son environnement
- Aucun Dockerfile ni fichier Docker Compose
- Propose un modèle de pull request
- Lire le guide de contribution
Par où commencer
- Lisez l'issue en entier, puis le guide de contribution du projet.
- Signalez en commentaire que vous la prenez — cela évite que deux personnes fassent le même travail.
- Forkez le dépôt et travaillez sur une branche.
- Ouvrez une pull request qui référence le numéro de l'issue.
Autres issues de nodejs/node
-
doc
Difficulté 1/5 Moins d'une heure Accessibilité débutants 90/100
Les mainteneurs répondent en général sous 1 jour
-
doc
Difficulté 2/5 1-3 heures Accessibilité débutants 65/100
Les mainteneurs répondent en général sous 1 jour
-
build
Difficulté 1/5 Moins d'une heure Accessibilité débutants 88/100
nodejs/node#66076 · 2 commentaires ·
Les mainteneurs répondent en général sous 1 jour
-
Difficulté 2/5 1-3 heures Accessibilité débutants 84/100
nodejs/node#65994 · 2 commentaires · 2 réactions ·
Les mainteneurs répondent en général sous 1 jour
-
feature request
Difficulté 2/5 1-3 heures Accessibilité débutants 68/100
nodejs/node#63841 · 1 commentaire ·
Les mainteneurs répondent en général sous 1 jour
Toutes les issues de nodejs/node
Issues similaires
-
Difficulté 2/5 1-3 heures Accessibilité débutants 78/100
TheOdinProject/curriculum#31444 ·
Les mainteneurs répondent en général sous 1 jour
-
[software-development-practices:nist-ssdf] github/gh-aw-threat-detection repository guidanceOuvertesoftware-development-practices software-development-practices:nist-ssdf
Difficulté 2/5 1-3 heures Accessibilité débutants 82/100
githubnext/gh-aw-cao#15860 ·
Les mainteneurs répondent en général sous 1 jour
-
framework/gatsby help wanted kind/bug
Difficulté 2/5 1-3 heures Accessibilité débutants 87/100
Les mainteneurs répondent en général sous 2 jours
-
bug
Difficulté 1/5 Moins d'une heure Accessibilité débutants 92/100
PedestrianDynamics/pyFDS-Evac#476 ·
Les mainteneurs répondent en général sous 1 jour
-
Difficulté 2/5 1-3 heures Accessibilité débutants 68/100
aiko-chan-ai/DiscordBotClient#380 ·