summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/ninep/ctl.zig7
1 files changed, 6 insertions, 1 deletions
diff --git a/src/ninep/ctl.zig b/src/ninep/ctl.zig
index 5827a4ed..c5e47d5d 100644
--- a/src/ninep/ctl.zig
+++ b/src/ninep/ctl.zig
@@ -665,8 +665,12 @@ pub fn writePager(p: *Pardes, req: Req) Reply {
var shown: [256]u8 = undefined;
return tree.failText(req.tag, E.INVAL, std.fmt.bufPrint(&p.fs.ename, "pager: invalid directory \"{s}\": must be absolute", .{blanked(dir[0..@min(dir.len, shown.len)], &shown)}) catch "pager: invalid directory: must be absolute");
}
- if (comptime pardes.hosted) if (dir.len > 0) if (pardes.filesystem.localPath(dir)) |local| if (!exec_line.isDirectory(local))
+ if (comptime pardes.hosted) if (dir.len > 0) if (pardes.filesystem.localPath(dir)) |local| if (!exec_line.isDirectory(local)) {
+ // A file there is no directory, ENOTDIR; nothing there, ENOENT.
+ if (exec_line.kindOf(local) != null)
+ return tree.failText(req.tag, E.NOTDIR, std.fmt.bufPrint(&p.fs.ename, "pager: {s}: not a directory", .{dir[0..@min(dir.len, 256)]}) catch "pager: not a directory");
return tree.failText(req.tag, E.NOENT, std.fmt.bufPrint(&p.fs.ename, "pager: {s}: no such directory", .{dir[0..@min(dir.len, 256)]}) catch "pager: no such directory");
+ };
// Nor one that may not be written, as a file's name there is refused.
if (comptime pardes.hosted) if (dir.len > 0) if (pardes.filesystem.localPath(dir)) |local| if (pardes.filesystem.deniedAbove(local))
return tree.failText(req.tag, E.PERM, std.fmt.bufPrint(&p.fs.ename, "pager: {s}: permission denied", .{dir[0..@min(dir.len, 256)]}) catch "pager: permission denied");
@@ -4072,6 +4076,7 @@ test "pager answers its +Pager on the open that asked, whatever another client e
try testing.expectEqual(E.INVAL, relative.errno());
try testing.expectEqualStrings("pager: invalid directory \"relative\": must be absolute", relative.reply.ename);
try testing.expectEqual(E.NOENT, wr(p, pager, "/tmp/pardes-surely-missing-dir\n").errno());
+ try testing.expectEqual(E.NOTDIR, wr(p, pager, "/etc/passwd\n").errno());
}
test "a command pane an exec open was answered is leased to it while it stays open: another client's command gets a pane of its own" {