diff options
author | 2023-02-16 14:01:07 -0800 | |
---|---|---|
committer | 2023-02-16 14:01:07 -0800 | |
commit | 7762f3fad739e7c50f0ebe29b22b55a8daf7f559 (patch) | |
tree | f2c768685b36365bfec97d39112cc11dac19d68d | |
parent | e7cd45d0fa3f381238ea2ebfbba2d9e738376fcc (diff) | |
download | bun-7762f3fad739e7c50f0ebe29b22b55a8daf7f559.tar.gz bun-7762f3fad739e7c50f0ebe29b22b55a8daf7f559.tar.zst bun-7762f3fad739e7c50f0ebe29b22b55a8daf7f559.zip |
Fix #1516 (#2089)
`FileSystemFlags.fromJS` was hardcoded to return O_RDONLY when the flag value
was null or undefined and this caused breakage when used with write functions.
Updated the function to take a `default` argument so that the caller can specify
a sane default for their use.
Diffstat (limited to '')
-rw-r--r-- | src/bun.js/node/node_fs.zig | 10 | ||||
-rw-r--r-- | src/bun.js/node/types.zig | 4 | ||||
-rw-r--r-- | test/bun.js/fs.test.js | 7 |
3 files changed, 14 insertions, 7 deletions
diff --git a/src/bun.js/node/node_fs.zig b/src/bun.js/node/node_fs.zig index f09e9b4fd..983874ea6 100644 --- a/src/bun.js/node/node_fs.zig +++ b/src/bun.js/node/node_fs.zig @@ -1027,14 +1027,14 @@ const Arguments = struct { if (val.isObject()) { if (val.getIfPropertyExists(ctx.ptr(), "flags")) |flags_| { - flags = FileSystemFlags.fromJS(ctx, flags_, exception) orelse flags; + flags = FileSystemFlags.fromJS(ctx, flags_, flags, exception) orelse flags; } if (val.getIfPropertyExists(ctx.ptr(), "mode")) |mode_| { mode = JSC.Node.modeFromJS(ctx, mode_, exception) orelse mode; } } else if (!val.isEmpty()) { - flags = FileSystemFlags.fromJS(ctx, val, exception) orelse flags; + flags = FileSystemFlags.fromJS(ctx, val, flags, exception) orelse flags; if (arguments.nextEat()) |next| { mode = JSC.Node.modeFromJS(ctx, next, exception) orelse mode; @@ -1508,7 +1508,7 @@ const Arguments = struct { } if (arg.getIfPropertyExists(ctx.ptr(), "flag")) |flag_| { - flag = FileSystemFlags.fromJS(ctx, flag_, exception) orelse { + flag = FileSystemFlags.fromJS(ctx, flag_, flag, exception) orelse { if (exception.* == null) { JSC.throwInvalidArguments( "Invalid flag", @@ -1615,7 +1615,7 @@ const Arguments = struct { } if (arg.getIfPropertyExists(ctx.ptr(), "flag")) |flag_| { - flag = FileSystemFlags.fromJS(ctx, flag_, exception) orelse { + flag = FileSystemFlags.fromJS(ctx, flag_, flag, exception) orelse { if (exception.* == null) { JSC.throwInvalidArguments( "Invalid flag", @@ -1785,7 +1785,7 @@ const Arguments = struct { if (arguments.next()) |arg| { arguments.eat(); if (arg.isString()) { - mode = FileSystemFlags.fromJS(ctx, arg, exception) orelse { + mode = FileSystemFlags.fromJS(ctx, arg, mode, exception) orelse { if (exception.* == null) { JSC.throwInvalidArguments( "Invalid mode", diff --git a/src/bun.js/node/types.zig b/src/bun.js/node/types.zig index 109497a93..d5ed86f4a 100644 --- a/src/bun.js/node/types.zig +++ b/src/bun.js/node/types.zig @@ -964,9 +964,9 @@ pub const FileSystemFlags = enum(Mode) { const O_SYNC: Mode = 0; const O_TRUNC: Mode = std.os.O.TRUNC; - pub fn fromJS(ctx: JSC.C.JSContextRef, val: JSC.JSValue, exception: JSC.C.ExceptionRef) ?FileSystemFlags { + pub fn fromJS(ctx: JSC.C.JSContextRef, val: JSC.JSValue, default: FileSystemFlags, exception: JSC.C.ExceptionRef) ?FileSystemFlags { if (val.isUndefinedOrNull()) { - return @intToEnum(FileSystemFlags, O_RDONLY); + return default; } if (val.isNumber()) { diff --git a/test/bun.js/fs.test.js b/test/bun.js/fs.test.js index 086f19211..5e4827672 100644 --- a/test/bun.js/fs.test.js +++ b/test/bun.js/fs.test.js @@ -987,3 +987,10 @@ it("fs.Dirent", () => { it("fs.Stats", () => { expect(Stats).toBeDefined(); }); + +it("repro 1516: can use undefined/null to specify default flag", () => { + const path = "/tmp/repro_1516.txt"; + writeFileSync(path, "b", { flag: undefined }); + expect(readFileSync(path, { encoding: "utf8", flag: null })).toBe("b"); + rmSync(path); +}); |