nodejs / nodejs/node

vfs: MemoryProvider.setReadOnly() does not prevent writes through existing file descriptors

Ouverte
#64,401 0 commentaires 0 réactions 0 personnes assignées Voir sur GitHub

Personne n'a encore pris cette issue.

Langage dominant
JavaScript
Étoiles
122k
Forks
37.3k
Merge moyen
4 j 2 h
PR mergées (30 j)
283

Description

Version

latest main branch

Platform
7.1.2-arch3-1
Subsystem

vfs

What steps will reproduce the bug?
const vfs = require('node:vfs');

const provider = new vfs.MemoryProvider();
const virtualFs = vfs.create(provider, {
  emitExperimentalWarning: false,
});

virtualFs.writeFileSync('/file.txt', 'old');

const fd = virtualFs.openSync('/file.txt', 'r+');

provider.setReadOnly();

const data = Buffer.from('new');
virtualFs.writeSync(fd, data, 0, data.length, 0);

console.log(virtualFs.readFileSync('/file.txt', 'utf8')); // "new"

virtualFs.closeSync(fd);

Run with:

node --experimental-vfs reproduction.js

How often does it reproduce? Is there a required condition?

It reproduces consistently.

The writable file descriptor must be opened before setReadOnly() is called. Opening a new writable descriptor after setReadOnly() correctly throws EROFS.

What is the expected behavior? Why is that the expected behavior?

Once setReadOnly() has been called, subsequent writes through any VirtualFileSystem backed by that provider should throw an error with code === 'EROFS', including writes through file descriptors that were opened before the provider became read-only.

This follows the current documentation for MemoryProvider.setReadOnly():

Subsequent writes through any VirtualFileSystem using this provider throw EROFS.

ftruncateSync() through an existing writable descriptor should similarly throw EROFS.

What do you see instead?

writeSync() succeeds and modifies the file even though:

virtualFs.readonly === true

ftruncateSync() also succeeds through a descriptor opened before setReadOnly().

Additional information

MemoryProvider.openSync() checks provider.readonly when a writable handle is opened. However, an existing MemoryFileHandle does not retain or re-check the provider's read-only state.

File-descriptor operations such as VirtualFileSystem.writeSync() and ftruncateSync() operate directly on the stored handle, so they bypass the provider's current readonly value.

Path-based writes made after setReadOnly(), such as writeFileSync(), already throw EROFS as expected.

Guide de contribution

Ouvrir le guide de contribution

Par où commencer

  1. Lisez l'issue en entier, puis le guide de contribution du projet.
  2. Signalez en commentaire que vous la prenez — cela évite que deux personnes fassent le même travail.
  3. Forkez le dépôt et travaillez sur une branche.
  4. Ouvrez une pull request qui référence le numéro de l'issue.

Piste de recherche

Commencez par les chemins nommés MemoryProvider.openSync(), MemoryFileHandle, VirtualFileSystem.writeSync() et ftruncateSync(), puis exécutez la reproduction fournie avec --experimental-vfs. C’est terminé lorsque les écritures et les troncatures via des descripteurs ouverts avant setReadOnly() lèvent EROFS, tandis que le comportement existant basé sur les chemins reste intact.

Rédigé par le modèle d'indexation à partir du texte de l'issue.

Évaluation

Stack technique
javascript, node.js
Domaine
operating-systems
Type d'issue
Bug
Difficulté
3/5
Temps estimé
1-2 jours
Activité
Calme
Clarté
Plutôt claire
Accessibilité débutants
68/100

Recevez les nouvelles issues par e-mail

Un résumé court des issues GitHub adaptées aux débutants.