| ... | @@ -132,7 +132,9 @@ pub fn detect(cross_target: CrossTarget) DetectError!NativeTargetInfo { | ... | @@ -132,7 +132,9 @@ pub fn detect(cross_target: CrossTarget) DetectError!NativeTargetInfo { |
| 132 | std.os.KERN.OSRELEASE, | 132 | std.os.KERN.OSRELEASE, |
| 133 | }; | 133 | }; |
| 134 | var buf: [64]u8 = undefined; | 134 | var buf: [64]u8 = undefined; |
| 135 | var len: usize = buf.len; | 135 | // consider that sysctl result includes null-termination |
| | 136 | // reserve 1 byte to ensure we never overflow when appending ".0" |
| | 137 | var len: usize = buf.len - 1; |
| 136 | | 138 | |
| 137 | std.os.sysctl(&mib, &buf, &len, null, 0) catch |err| switch (err) { | 139 | std.os.sysctl(&mib, &buf, &len, null, 0) catch |err| switch (err) { |
| 138 | error.NameTooLong => unreachable, // constant, known good value | 140 | error.NameTooLong => unreachable, // constant, known good value |
| ... | @@ -142,7 +144,12 @@ pub fn detect(cross_target: CrossTarget) DetectError!NativeTargetInfo { | ... | @@ -142,7 +144,12 @@ pub fn detect(cross_target: CrossTarget) DetectError!NativeTargetInfo { |
| 142 | error.Unexpected => return error.OSVersionDetectionFail, | 144 | error.Unexpected => return error.OSVersionDetectionFail, |
| 143 | }; | 145 | }; |
| 144 | | 146 | |
| 145 | if (std.SemanticVersion.parse(buf[0 .. len - 1])) |ver| { | 147 | // append ".0" to satisfy semver |
| | 148 | buf[len - 1] = '.'; |
| | 149 | buf[len] = '0'; |
| | 150 | len += 1; |
| | 151 | |
| | 152 | if (std.SemanticVersion.parse(buf[0..len])) |ver| { |
| 146 | os.version_range.semver.min = ver; | 153 | os.version_range.semver.min = ver; |
| 147 | os.version_range.semver.max = ver; | 154 | os.version_range.semver.max = ver; |
| 148 | } else |_| { | 155 | } else |_| { |