vfs: MemoryProvider.setReadOnly() does not prevent writes through existing file descriptors
Nadie ha tomado este issue todavía.
- Lenguaje dominante
- JavaScript
- Estrellas
- 122k
- Forks
- 37.3k
- Merge medio
- 4 d 2 h
- PR fusionados (30 d)
- 283
Descripción
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.
Guía de contribución
Primeros pasos
- Lee el issue completo y luego la guía de contribución del proyecto.
- Comenta en el issue que vas a ocuparte — evita que dos personas hagan lo mismo.
- Haz un fork del repositorio y trabaja en una rama.
- Abre un pull request que haga referencia al número del issue.
Línea de trabajo
Comienza con las rutas indicadas MemoryProvider.openSync(), MemoryFileHandle, VirtualFileSystem.writeSync() y ftruncateSync(), y luego ejecuta la reproducción proporcionada con --experimental-vfs. Se considera terminado cuando las escrituras y truncaciones mediante descriptores abiertos antes de setReadOnly() lanzan EROFS, mientras el comportamiento existente basado en rutas permanece intacto.
Escrito por el modelo de indexación a partir del texto del issue.
Evaluación
- Stack tecnológico
- javascript, node.js
- Área
- operating-systems
- Tipo de issue
- Error
- Dificultad
- 3/5
- Tiempo estimado
- 1-2 días
- Estado de actividad
- Tranquilo
- Claridad
- Bastante claro
- Aptitud para principiantes
- 68/100