diff options
author | 2023-07-30 16:18:13 +0800 | |
---|---|---|
committer | 2023-07-30 01:18:13 -0700 | |
commit | 413fd281208f24a532c47249dec1bfc3aef2bf37 (patch) | |
tree | 824f840e3b1cf637b8a632fac7b1ff04fca1afb9 | |
parent | 40a9ba63409694443058f558df2e480a8f16ff54 (diff) | |
download | bun-413fd281208f24a532c47249dec1bfc3aef2bf37.tar.gz bun-413fd281208f24a532c47249dec1bfc3aef2bf37.tar.zst bun-413fd281208f24a532c47249dec1bfc3aef2bf37.zip |
Fix coredump when reading an empty file(`node:stream:createReadStream`) (#3882)
* Fix coredump when reading an empty file.
Close: #3607
* It seems that the fd is closed when `auto_close` is true.
-rw-r--r-- | src/bun.js/webcore/streams.zig | 4 | ||||
-rw-r--r-- | test/js/node/stream/node-stream.test.js | 26 |
2 files changed, 30 insertions, 0 deletions
diff --git a/src/bun.js/webcore/streams.zig b/src/bun.js/webcore/streams.zig index 5dc4ea830..f2c5914ef 100644 --- a/src/bun.js/webcore/streams.zig +++ b/src/bun.js/webcore/streams.zig @@ -4433,6 +4433,10 @@ pub const FileReader = struct { var readable_file = File{ .loop = this.globalThis().bunVM().eventLoop() }; const result = readable_file.start(&blob.data.file); + if (result == .empty) { + this.lazy_readable = .{ .empty = {} }; + return result; + } if (result != .ready) { return result; } diff --git a/test/js/node/stream/node-stream.test.js b/test/js/node/stream/node-stream.test.js index 51252a5f6..5f5b9d67a 100644 --- a/test/js/node/stream/node-stream.test.js +++ b/test/js/node/stream/node-stream.test.js @@ -41,6 +41,32 @@ describe("Readable", () => { readable.pipe(writable); }); + it("should be able to be piped via .pipe, issue #3607", done => { + const path = `${tmpdir()}/${Date.now()}.testReadStreamEmptyFile.txt`; + writeFileSync(path, ""); + const stream = createReadStream(path); + stream.on("error", err => { + done(err); + }); + + let called = false; + const writable = new Writable({ + write(chunk, encoding, callback) { + called = true; + callback(); + }, + }); + writable.on("finish", () => { + try { + expect(called).toBeFalse(); + } catch (err) { + return done(err); + } + done(); + }); + + stream.pipe(writable); + }); it("should be able to be piped via .pipe, issue #3668", done => { const path = `${tmpdir()}/${Date.now()}.testReadStream.txt`; writeFileSync(path, "12345"); |