@@ -443,6 +443,32 @@ function buildArchiveSync(entries, comment) {
443443 await zip . close ( ) ;
444444} ) ( ) . then ( common . mustCall ( ) ) ;
445445
446+ // --- operations on closed handles fail with EBADF -------------------------
447+ ( async ( ) => {
448+ const archive = await buildArchive ( [ await zlib . ZipEntry . create ( 'a.txt' , Buffer . from ( 'x' ) ) ] ) ;
449+ const provider = new vfs . ZipProvider ( new zlib . ZipBuffer ( archive ) ) ;
450+
451+ const handle = await provider . open ( '/a.txt' , 'r+' ) ;
452+ await handle . close ( ) ;
453+ await assert . rejects ( handle . read ( Buffer . alloc ( 1 ) , 0 , 1 , 0 ) , { code : 'EBADF' } ) ;
454+ await assert . rejects ( handle . write ( Buffer . from ( 'x' ) , 0 , 1 , 0 ) , { code : 'EBADF' } ) ;
455+ await assert . rejects ( handle . readFile ( ) , { code : 'EBADF' } ) ;
456+ await assert . rejects ( handle . writeFile ( 'x' ) , { code : 'EBADF' } ) ;
457+ await assert . rejects ( handle . stat ( ) , { code : 'EBADF' } ) ;
458+ await assert . rejects ( handle . truncate ( ) , { code : 'EBADF' } ) ;
459+ await handle . close ( ) ; // Closing an already-closed handle is a no-op.
460+
461+ const syncHandle = provider . openSync ( '/a.txt' , 'r+' ) ;
462+ syncHandle . closeSync ( ) ;
463+ assert . throws ( ( ) => syncHandle . readSync ( Buffer . alloc ( 1 ) , 0 , 1 , 0 ) , { code : 'EBADF' } ) ;
464+ assert . throws ( ( ) => syncHandle . writeSync ( Buffer . from ( 'x' ) , 0 , 1 , 0 ) , { code : 'EBADF' } ) ;
465+ assert . throws ( ( ) => syncHandle . readFileSync ( ) , { code : 'EBADF' } ) ;
466+ assert . throws ( ( ) => syncHandle . writeFileSync ( 'x' ) , { code : 'EBADF' } ) ;
467+ assert . throws ( ( ) => syncHandle . statSync ( ) , { code : 'EBADF' } ) ;
468+ assert . throws ( ( ) => syncHandle . truncateSync ( ) , { code : 'EBADF' } ) ;
469+ syncHandle . closeSync ( ) ;
470+ } ) ( ) . then ( common . mustCall ( ) ) ;
471+
446472// --- numeric open flags are normalized like node:fs (O_* constants) --------
447473( async ( ) => {
448474 const { O_RDONLY , O_WRONLY , O_CREAT , O_TRUNC } = fs . constants ;
0 commit comments