From c0c228b758150e017185dc280ef020ec3b7efdcf Mon Sep 17 00:00:00 2001 From: Euan Torano Date: Fri, 2 Aug 2019 13:19:49 +0100 Subject: [PATCH 1/5] Check if /dev/urandom is a character device --- std/os.zig | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/std/os.zig b/std/os.zig index 9ff2e8f87f..da1d71d6fc 100644 --- a/std/os.zig +++ b/std/os.zig @@ -133,6 +133,11 @@ fn getRandomBytesDevURandom(buf: []u8) !void { const fd = try openC(c"/dev/urandom", O_RDONLY | O_CLOEXEC, 0); defer close(fd); + const st = try fstat(fd); + if (!S_ISCHR(st.mode)) { + return OpenError.Unexpected; + } + const stream = &std.fs.File.openHandle(fd).inStream().stream; stream.readNoEof(buf) catch return error.Unexpected; } From 1583efda69622b9c7809419a4320f4e8ea6fd4e3 Mon Sep 17 00:00:00 2001 From: Euan Torano Date: Fri, 2 Aug 2019 15:44:58 +0100 Subject: [PATCH 2/5] Fix call to S_ISCHR and implement for Mac --- std/os.zig | 4 ++-- std/os/bits/darwin.zig | 50 ++++++++++++++++++++++++++++++++++++++++++ std/os/darwin.zig | 1 + 3 files changed, 53 insertions(+), 2 deletions(-) diff --git a/std/os.zig b/std/os.zig index da1d71d6fc..ce240bb956 100644 --- a/std/os.zig +++ b/std/os.zig @@ -134,8 +134,8 @@ fn getRandomBytesDevURandom(buf: []u8) !void { defer close(fd); const st = try fstat(fd); - if (!S_ISCHR(st.mode)) { - return OpenError.Unexpected; + if (!system.S_ISCHR(st.mode)) { + return error.Unexpected; } const stream = &std.fs.File.openHandle(fd).inStream().stream; diff --git a/std/os/bits/darwin.zig b/std/os/bits/darwin.zig index b8d229dbe9..dd4d46287e 100644 --- a/std/os/bits/darwin.zig +++ b/std/os/bits/darwin.zig @@ -1116,3 +1116,53 @@ pub const stack_t = extern struct { ss_size: isize, ss_flags: i32, }; + +pub const S_IFMT = 0o170000; + +pub const S_IFIFO = 0o010000; +pub const S_IFCHR = 0o020000; +pub const S_IFDIR = 0o040000; +pub const S_IFBLK = 0o060000; +pub const S_IFREG = 0o100000; +pub const S_IFLNK = 0o120000; +pub const S_IFSOCK = 0o140000; +pub const S_IFWHT = 0o160000; + +pub const S_ISUID = 0o4000; +pub const S_ISGID = 0o2000; +pub const S_ISVTX = 0o1000; +pub const S_IRUSR = 0o400; +pub const S_IWUSR = 0o200; +pub const S_IXUSR = 0o100; + +pub fn S_ISFIFO(m: u32) bool { + return m & S_IFMT == S_IFIFO; +} + +pub fn S_ISCHR(m: u32) bool { + return m & S_IFMT == S_IFCHR; +} + +pub fn S_ISDIR(m: u32) bool { + return m & S_IFMT == S_IFDIR; +} + +pub fn S_ISBLK(m: u32) bool { + return m & S_IFMT == S_IFBLK; +} + +pub fn S_ISREG(m: u32) bool { + return m & S_IFMT == S_IFREG; +} + +pub fn S_ISLNK(m: u32) bool { + return m & S_IFMT == S_IFLNK; +} + +pub fn S_ISSOCK(m: u32) bool { + return m & S_IFMT == S_IFSOCK; +} + +pub fn S_IWHT(m: u32) bool { + return m & S_IFMT == S_IFWHT; +} diff --git a/std/os/darwin.zig b/std/os/darwin.zig index 67ce9a06cf..c2b6801e22 100644 --- a/std/os/darwin.zig +++ b/std/os/darwin.zig @@ -5,3 +5,4 @@ pub const is_the_target = switch (builtin.os) { else => false, }; pub usingnamespace std.c; +pub usingnamespace @import("bits.zig"); \ No newline at end of file From 24fbd1f1d58125f34ca2ae52a592028f39412aa9 Mon Sep 17 00:00:00 2001 From: Euan Torano Date: Fri, 2 Aug 2019 15:59:40 +0100 Subject: [PATCH 3/5] Add S_* values for freebsd. --- std/os/bits/darwin.zig | 9 +++++++ std/os/bits/freebsd.zig | 59 +++++++++++++++++++++++++++++++++++++++++ std/os/freebsd.zig | 1 + 3 files changed, 69 insertions(+) diff --git a/std/os/bits/darwin.zig b/std/os/bits/darwin.zig index dd4d46287e..483d4cda90 100644 --- a/std/os/bits/darwin.zig +++ b/std/os/bits/darwin.zig @@ -1131,9 +1131,18 @@ pub const S_IFWHT = 0o160000; pub const S_ISUID = 0o4000; pub const S_ISGID = 0o2000; pub const S_ISVTX = 0o1000; +pub const S_IRWXU = 0o700; pub const S_IRUSR = 0o400; pub const S_IWUSR = 0o200; pub const S_IXUSR = 0o100; +pub const S_IRWXG = 0o070; +pub const S_IRGRP = 0o040; +pub const S_IWGRP = 0o020; +pub const S_IXGRP = 0o010; +pub const S_IRWXO = 0o007; +pub const S_IROTH = 0o004; +pub const S_IWOTH = 0o002; +pub const S_IXOTH = 0o001; pub fn S_ISFIFO(m: u32) bool { return m & S_IFMT == S_IFIFO; diff --git a/std/os/bits/freebsd.zig b/std/os/bits/freebsd.zig index 198857983e..45432a6c07 100644 --- a/std/os/bits/freebsd.zig +++ b/std/os/bits/freebsd.zig @@ -876,3 +876,62 @@ pub const stack_t = extern struct { ss_size: isize, ss_flags: i32, }; + +pub const S_IFMT = 0o170000; + +pub const S_IFIFO = 0o010000; +pub const S_IFCHR = 0o020000; +pub const S_IFDIR = 0o040000; +pub const S_IFBLK = 0o060000; +pub const S_IFREG = 0o100000; +pub const S_IFLNK = 0o120000; +pub const S_IFSOCK = 0o140000; +pub const S_IFWHT = 0o160000; + +pub const S_ISUID = 0o4000; +pub const S_ISGID = 0o2000; +pub const S_ISVTX = 0o1000; +pub const S_IRWXU = 0o700; +pub const S_IRUSR = 0o400; +pub const S_IWUSR = 0o200; +pub const S_IXUSR = 0o100; +pub const S_IRWXG = 0o070; +pub const S_IRGRP = 0o040; +pub const S_IWGRP = 0o020; +pub const S_IXGRP = 0o010; +pub const S_IRWXO = 0o007; +pub const S_IROTH = 0o004; +pub const S_IWOTH = 0o002; +pub const S_IXOTH = 0o001; + +pub fn S_ISFIFO(m: u32) bool { + return m & S_IFMT == S_IFIFO; +} + +pub fn S_ISCHR(m: u32) bool { + return m & S_IFMT == S_IFCHR; +} + +pub fn S_ISDIR(m: u32) bool { + return m & S_IFMT == S_IFDIR; +} + +pub fn S_ISBLK(m: u32) bool { + return m & S_IFMT == S_IFBLK; +} + +pub fn S_ISREG(m: u32) bool { + return m & S_IFMT == S_IFREG; +} + +pub fn S_ISLNK(m: u32) bool { + return m & S_IFMT == S_IFLNK; +} + +pub fn S_ISSOCK(m: u32) bool { + return m & S_IFMT == S_IFSOCK; +} + +pub fn S_IWHT(m: u32) bool { + return m & S_IFMT == S_IFWHT; +} diff --git a/std/os/freebsd.zig b/std/os/freebsd.zig index d418ccd415..e9efe64920 100644 --- a/std/os/freebsd.zig +++ b/std/os/freebsd.zig @@ -2,3 +2,4 @@ const std = @import("../std.zig"); const builtin = @import("builtin"); pub const is_the_target = builtin.os == .freebsd; pub usingnamespace std.c; +pub usingnamespace @import("bits.zig"); \ No newline at end of file From 8e157ccb23885b2a9a8a5d66c3955fc560fd0074 Mon Sep 17 00:00:00 2001 From: Euan T Date: Sat, 3 Aug 2019 07:50:30 +0100 Subject: [PATCH 4/5] Update returned error return when not a character device. Co-Authored-By: Andrew Kelley --- std/os.zig | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/std/os.zig b/std/os.zig index ce240bb956..2caab634d6 100644 --- a/std/os.zig +++ b/std/os.zig @@ -135,7 +135,7 @@ fn getRandomBytesDevURandom(buf: []u8) !void { const st = try fstat(fd); if (!system.S_ISCHR(st.mode)) { - return error.Unexpected; + return error.NoDevice; } const stream = &std.fs.File.openHandle(fd).inStream().stream; From 08251fbc544aa03c77d4c311e267689592432282 Mon Sep 17 00:00:00 2001 From: Euan T Date: Sat, 3 Aug 2019 07:51:36 +0100 Subject: [PATCH 5/5] Omit system namespace. Co-Authored-By: Andrew Kelley --- std/os.zig | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/std/os.zig b/std/os.zig index 2caab634d6..c2010bf6a9 100644 --- a/std/os.zig +++ b/std/os.zig @@ -134,7 +134,7 @@ fn getRandomBytesDevURandom(buf: []u8) !void { defer close(fd); const st = try fstat(fd); - if (!system.S_ISCHR(st.mode)) { + if (!S_ISCHR(st.mode)) { return error.NoDevice; }