diff --git a/src/node_file.cc b/src/node_file.cc index 769d76670180fa..c341962cc60dbf 100644 --- a/src/node_file.cc +++ b/src/node_file.cc @@ -301,6 +301,7 @@ MaybeLocal FileHandle::ClosePromise() { close->file_handle()->AfterClose(); Isolate* isolate = close->env()->isolate(); if (req->result < 0) { + HandleScope handle_scope(isolate); close->Reject(UVException(isolate, req->result, "close")); } else { close->Resolve(); diff --git a/test/parallel/test-filehandle-close.js b/test/parallel/test-filehandle-close.js new file mode 100644 index 00000000000000..457b06a486f90f --- /dev/null +++ b/test/parallel/test-filehandle-close.js @@ -0,0 +1,17 @@ +'use strict'; +const common = require('../common'); +const assert = require('assert'); +const fs = require('fs'); + +// Test that using FileHandle.close to close an already-closed fd fails +// with EBADF. + +(async function() { + const fh = await fs.promises.open(__filename); + fs.closeSync(fh.fd); + + assert.rejects(() => fh.close(), { + code: 'EBADF', + syscall: 'close' + }); +})().then(common.mustCall());