From 3e93dce0a12e8b09f2de30276364d9ee18c6ada0 Mon Sep 17 00:00:00 2001 From: LemonBoy Date: Tue, 10 Mar 2020 12:16:56 +0100 Subject: [PATCH] std: Fix detection of Linux kernel version --- lib/std/os/bits/linux.zig | 12 ++++++------ lib/std/zig/system.zig | 11 +++++++++-- 2 files changed, 15 insertions(+), 8 deletions(-) diff --git a/lib/std/os/bits/linux.zig b/lib/std/os/bits/linux.zig index e20e96181a..2a58c14490 100644 --- a/lib/std/os/bits/linux.zig +++ b/lib/std/os/bits/linux.zig @@ -1296,12 +1296,12 @@ pub const io_uring_files_update = struct { }; pub const utsname = extern struct { - sysname: [65]u8, - nodename: [65]u8, - release: [65]u8, - version: [65]u8, - machine: [65]u8, - domainname: [65]u8, + sysname: [64:0]u8, + nodename: [64:0]u8, + release: [64:0]u8, + version: [64:0]u8, + machine: [64:0]u8, + domainname: [64:0]u8, }; pub const HOST_NAME_MAX = 64; diff --git a/lib/std/zig/system.zig b/lib/std/zig/system.zig index a4e065e184..336dd0d314 100644 --- a/lib/std/zig/system.zig +++ b/lib/std/zig/system.zig @@ -201,8 +201,15 @@ pub const NativeTargetInfo = struct { switch (Target.current.os.tag) { .linux => { const uts = std.os.uname(); - const release = mem.toSliceConst(u8, @ptrCast([*:0]const u8, &uts.release)); - if (std.builtin.Version.parse(release)) |ver| { + const release = mem.toSliceConst(u8, &uts.release); + // The release field may have several other fields after the + // kernel version + const kernel_version = if (mem.indexOfScalar(u8, release, '-')) |pos| + release[0..pos] + else + release; + + if (std.builtin.Version.parse(kernel_version)) |ver| { os.version_range.linux.range.min = ver; os.version_range.linux.range.max = ver; } else |err| switch (err) {