mirror of
https://github.com/denoland/deno.git
synced 2024-11-24 15:19:26 -05:00
fix(ext/fs): truncate files when a ReadableStream is passed to writeFile (#23330)
Closes #19697. This fixes a bug where the writeFile API can create partially-overwritten files which may lead to invalid / corrupt files or data leakage. It also aligns the behavior of writing a ReadableStream and writing a Uint8Array to the disk.
This commit is contained in:
parent
35e5159c8d
commit
506c275053
2 changed files with 19 additions and 0 deletions
|
@ -926,6 +926,7 @@ async function writeFile(
|
|||
append: options.append ?? false,
|
||||
create: options.create ?? true,
|
||||
createNew: options.createNew ?? false,
|
||||
truncate: !(options.append ?? false),
|
||||
write: true,
|
||||
});
|
||||
await data.pipeTo(file.writable, {
|
||||
|
|
|
@ -425,3 +425,21 @@ Deno.test(
|
|||
assertEquals(Deno.readFileSync(filename), new Uint8Array([1, 2]));
|
||||
},
|
||||
);
|
||||
|
||||
Deno.test(
|
||||
{ permissions: { read: true, write: true } },
|
||||
async function overwriteFileWithStream() {
|
||||
const filename = Deno.makeTempDirSync() + "/test.txt";
|
||||
await Deno.writeFile(filename, new Uint8Array([1, 2, 3, 4]));
|
||||
|
||||
const stream = new ReadableStream({
|
||||
pull(controller) {
|
||||
controller.enqueue(new Uint8Array([1]));
|
||||
controller.enqueue(new Uint8Array([2]));
|
||||
controller.close();
|
||||
},
|
||||
});
|
||||
await Deno.writeFile(filename, stream);
|
||||
assertEquals(Deno.readFileSync(filename), new Uint8Array([1, 2]));
|
||||
},
|
||||
);
|
||||
|
|
Loading…
Reference in a new issue