From 8e68d18cf296ec8122b57b555004acbbefb44815 Mon Sep 17 00:00:00 2001 From: Robert Günzler Date: Wed, 23 Sep 2026 13:20:24 +0200 Subject: sort paths before writing component xattr MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Robert Günzler --- src/main.zig | 20 +++++++++++++++----- 1 file changed, 15 insertions(+), 5 deletions(-) (limited to 'src') diff --git a/src/main.zig b/src/main.zig index 2d055db..dce7aef 100644 --- a/src/main.zig +++ b/src/main.zig @@ -181,10 +181,6 @@ const Builder = struct { fn build(self: *Builder, io: Io, gpa: Allocator) !void { log.debug("{s}: building", .{self.source.path}); - // track source - try self.parts.append(gpa, try gpa.dupe(u8, self.source.path)); - try self.dgsts.append(gpa, try self.source.digest()); - const source_stem = std.fs.path.stem(self.source.path); // handle meta pages before even creating target_path @@ -411,6 +407,10 @@ const Builder = struct { }); try writer.interface.flush(); + // track source + try self.parts.append(gpa, try gpa.dupe(u8, self.source.path)); + try self.dgsts.append(gpa, try self.source.digest()); + try self.finalize(gpa, target_fd); log.debug("{s}: done", .{self.source.path}); } @@ -489,6 +489,7 @@ fn isFullPage(source: File) !bool { } fn compositeDigest(parts: []Digest) Digest { + // sort digests before computing composite std.sort.block(Digest, parts, {}, comptime struct { pub fn inner(_: void, a: Digest, b: Digest) bool { return std.mem.lessThan(u8, &a, &b); @@ -543,7 +544,16 @@ fn getXattrSourceDigest(gpa: Allocator, fd: Io.File) !Digest { return val[0..16].*; } -fn setXattrSourceComponents(gpa: Allocator, fd: Io.File, parts: []const []const u8) !void { +fn setXattrSourceComponents(gpa: Allocator, fd: Io.File, parts: [][]const u8) !void { + if (parts.len < 1) return error.InvalidComponents; + + // sort parts before joining + std.sort.block([]const u8, parts, {}, comptime struct { + pub fn inner(_: void, a: []const u8, b: []const u8) bool { + return std.mem.lessThan(u8, a, b); + } + }.inner); + const val = try std.mem.join(gpa, ";", parts); defer gpa.free(val); return try setXattr(fd, XATTR_SOURCE_COMPONENTS, val); -- cgit 1.4.1