zig

fork of https://codeberg.org/ziglang/zig
Log | Files | Refs | README | LICENSE

commit 7da9e4b35e710d6b94114a21017630c5f15940bd (tree)
parent 530cc2c1111699d9d02ad9ebef94efa6b99f5205
Author: Andrew Kelley <andrew@ziglang.org>
Date:   Thu, 28 Aug 2025 18:30:32 -0700

std.tz: fix redundant endian handling

I didn't notice the check+swap before.

Diffstat:
Mlib/std/tz.zig | 39+++++++++++++++++++--------------------
1 file changed, 19 insertions(+), 20 deletions(-)

diff --git a/lib/std/tz.zig b/lib/std/tz.zig @@ -1,3 +1,6 @@ +//! The Time Zone Information Format (TZif) +//! https://datatracker.ietf.org/doc/html/rfc8536 + const builtin = @import("builtin"); const std = @import("std.zig"); @@ -58,30 +61,26 @@ pub const Tz = struct { }; pub fn parse(allocator: Allocator, reader: *Reader) !Tz { - var legacy_header = try reader.takeStruct(Header, .little); + const legacy_header = try reader.takeStruct(Header, .big); if (!std.mem.eql(u8, &legacy_header.magic, "TZif")) return error.BadHeader; - if (legacy_header.version != 0 and legacy_header.version != '2' and legacy_header.version != '3') return error.BadVersion; - - if (builtin.target.cpu.arch.endian() != std.builtin.Endian.big) { - std.mem.byteSwapAllFields(@TypeOf(legacy_header.counts), &legacy_header.counts); - } + if (legacy_header.version != 0 and legacy_header.version != '2' and legacy_header.version != '3') + return error.BadVersion; - if (legacy_header.version == 0) { + if (legacy_header.version == 0) return parseBlock(allocator, reader, legacy_header, true); - } else { - // If the format is modern, just skip over the legacy data - const skipv = legacy_header.counts.timecnt * 5 + legacy_header.counts.typecnt * 6 + legacy_header.counts.charcnt + legacy_header.counts.leapcnt * 8 + legacy_header.counts.isstdcnt + legacy_header.counts.isutcnt; - try reader.discardAll(skipv); - - var header = try reader.takeStruct(Header, .little); - if (!std.mem.eql(u8, &header.magic, "TZif")) return error.BadHeader; - if (header.version != '2' and header.version != '3') return error.BadVersion; - if (builtin.target.cpu.arch.endian() != std.builtin.Endian.big) { - std.mem.byteSwapAllFields(@TypeOf(header.counts), &header.counts); - } - return parseBlock(allocator, reader, header, false); - } + // If the format is modern, just skip over the legacy data + const skip_n = legacy_header.counts.timecnt * 5 + + legacy_header.counts.typecnt * 6 + + legacy_header.counts.charcnt + legacy_header.counts.leapcnt * 8 + + legacy_header.counts.isstdcnt + legacy_header.counts.isutcnt; + try reader.discardAll(skip_n); + + var header = try reader.takeStruct(Header, .big); + if (!std.mem.eql(u8, &header.magic, "TZif")) return error.BadHeader; + if (header.version != '2' and header.version != '3') return error.BadVersion; + + return parseBlock(allocator, reader, header, false); } fn parseBlock(allocator: Allocator, reader: *Reader, header: Header, legacy: bool) !Tz {