authorgravatar for kubkon@jakubkonka.comJakub Konka <kubkon@jakubkonka.com> 2022-12-15 23:08:04+01:00
committergravatar for kubkon@jakubkonka.comJakub Konka <kubkon@jakubkonka.com> 2022-12-16 18:05:58+01:00
log1928ed7dab3949db964d96dad82beb776e69554f
tree96026fe17b1f67513327428be4a5a7bc90e4c072
parent79b92f9eb850a1b4da08990d7b58f52391a802fb

macho: RingBuffer experiment to crack down the bug


1 files changed, 1 insertions(+), 55 deletions(-)

src/link/MachO/zld.zig+1-55
......@@ -2780,10 +2780,8 @@ pub const Zld = struct {
27802780
27812781 const chunk_size = 0x4000;
27822782
2783 var rb = RingBuffer{};
27842783 var hasher = Md5.init(.{});
27852784 var buffer: [chunk_size]u8 = undefined;
2786 var hashed: usize = 0;
27872785
27882786 for (subsections[0..count]) |cut| {
27892787 const size = cut.end - cut.start;
......@@ -2799,24 +2797,10 @@ pub const Zld = struct {
27992797 const amt = try self.file.preadAll(buffer[0..fsize], fstart);
28002798 if (amt != fsize) return error.InputOutput;
28012799
2802 var leftover = rb.append(buffer[0..fsize]);
2803 while (leftover > 0) {
2804 if (rb.full()) {
2805 hasher.update(rb.getBuffer());
2806 hashed += rb.getBuffer().len;
2807 rb.clear();
2808 }
2809 leftover = rb.append(buffer[fsize - leftover ..]);
2810 }
2800 hasher.update(buffer[0..fsize]);
28112801 }
28122802 }
28132803
2814 if (!rb.empty()) {
2815 hasher.update(rb.getBuffer());
2816 hashed += rb.getBuffer().len;
2817 rb.clear();
2818 }
2819
28202804 hasher.final(&self.uuid_cmd.uuid);
28212805 conformUuid(&self.uuid_cmd.uuid);
28222806 },
......@@ -2826,44 +2810,6 @@ pub const Zld = struct {
28262810 try self.file.pwriteAll(&self.uuid_cmd.uuid, in_file);
28272811 }
28282812
2829 const RingBuffer = struct {
2830 buffer: [chunk_size]u8 = undefined,
2831 pos: usize = 0,
2832
2833 const chunk_size = 0x4000;
2834
2835 fn append(rb: *RingBuffer, data: []u8) usize {
2836 const cpy_size = if (data.len > rb.available())
2837 data.len - rb.available()
2838 else
2839 data.len;
2840 mem.copy(u8, rb.buffer[rb.pos..], data[0..cpy_size]);
2841 rb.pos += cpy_size;
2842 const leftover = data.len - cpy_size;
2843 return leftover;
2844 }
2845
2846 fn available(rb: RingBuffer) usize {
2847 return rb.buffer.len - rb.pos;
2848 }
2849
2850 fn clear(rb: *RingBuffer) void {
2851 rb.pos = 0;
2852 }
2853
2854 fn full(rb: RingBuffer) bool {
2855 return rb.buffer.len == rb.pos;
2856 }
2857
2858 fn empty(rb: RingBuffer) bool {
2859 return rb.pos == 0;
2860 }
2861
2862 fn getBuffer(rb: *const RingBuffer) []const u8 {
2863 return rb.buffer[0..rb.pos];
2864 }
2865 };
2866
28672813 inline fn conformUuid(out: *[Md5.digest_length]u8) void {
28682814 // LC_UUID uuids should conform to RFC 4122 UUID version 4 & UUID version 5 formats
28692815 out[6] = (out[6] & 0x0F) | (3 << 4);