aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGravatar Justin Whear <justin.whear@gmail.com> 2023-02-16 14:01:07 -0800
committerGravatar GitHub <noreply@github.com> 2023-02-16 14:01:07 -0800
commit7762f3fad739e7c50f0ebe29b22b55a8daf7f559 (patch)
treef2c768685b36365bfec97d39112cc11dac19d68d
parente7cd45d0fa3f381238ea2ebfbba2d9e738376fcc (diff)
downloadbun-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.zig10
-rw-r--r--src/bun.js/node/types.zig4
-rw-r--r--test/bun.js/fs.test.js7
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);
+});