fs: invalidate blob created from empty file when written to

Fixes: https://github.com/nodejs/node/issues/47161
PR-URL: https://github.com/nodejs/node/pull/47199
Reviewed-By: Ben Noordhuis <info@bnoordhuis.nl>
Reviewed-By: Michaël Zasso <targos@protonmail.com>
This commit is contained in:
Debadree Chatterjee 2023-03-23 23:58:43 +05:30 committed by GitHub
parent f51c152f60
commit 73645d6227
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 20 additions and 12 deletions

View File

@ -1,14 +1,12 @@
'use strict';
const {
ArrayBuffer,
ArrayFrom,
MathMax,
MathMin,
ObjectDefineProperties,
ObjectDefineProperty,
PromiseReject,
PromiseResolve,
ReflectConstruct,
RegExpPrototypeExec,
RegExpPrototypeSymbolReplace,
@ -266,10 +264,6 @@ class Blob {
if (!isBlob(this))
return PromiseReject(new ERR_INVALID_THIS('Blob'));
if (this.size === 0) {
return PromiseResolve(new ArrayBuffer(0));
}
const { promise, resolve, reject } = createDeferredPromise();
const reader = this[kHandle].getReader();
const buffers = [];
@ -316,12 +310,6 @@ class Blob {
if (!isBlob(this))
throw new ERR_INVALID_THIS('Blob');
if (this.size === 0) {
return new lazyReadableStream({
start(c) { c.close(); },
});
}
const reader = this[kHandle].getReader();
return new lazyReadableStream({
start(c) {

View File

@ -20,12 +20,14 @@ const { Blob } = require('buffer');
const tmpdir = require('../common/tmpdir');
const testfile = path.join(tmpdir.path, 'test-file-backed-blob.txt');
const testfile2 = path.join(tmpdir.path, 'test-file-backed-blob2.txt');
const testfile3 = path.join(tmpdir.path, 'test-file-backed-blob3.txt');
tmpdir.refresh();
const data = `${'a'.repeat(1000)}${'b'.repeat(2000)}`;
writeFileSync(testfile, data);
writeFileSync(testfile2, data.repeat(100));
writeFileSync(testfile3, '');
(async () => {
const blob = await openAsBlob(testfile);
@ -79,3 +81,21 @@ writeFileSync(testfile2, data.repeat(100));
await unlink(testfile2);
})().then(common.mustCall());
(async () => {
const blob = await openAsBlob(testfile3);
strictEqual(blob.size, 0);
strictEqual(await blob.text(), '');
writeFileSync(testfile3, 'abc');
await rejects(blob.text(), { name: 'NotReadableError' });
await unlink(testfile3);
})().then(common.mustCall());
(async () => {
const blob = await openAsBlob(testfile3);
strictEqual(blob.size, 0);
writeFileSync(testfile3, 'abc');
const stream = blob.stream();
const reader = stream.getReader();
await rejects(() => reader.read(), { name: 'NotReadableError' });
})().then(common.mustCall());