diff options
| author | Jacob Young <jacobly0@users.noreply.github.com> | 2023-05-13 03:42:20 -0400 |
|---|---|---|
| committer | Jacob Young <jacobly0@users.noreply.github.com> | 2023-05-15 03:07:51 -0400 |
| commit | 72b4657053f94222c735b7c51c380649ce23c30e (patch) | |
| tree | f240b01ccac04f00addf7eb7746b03e9fc33aa0e /src/link/Dwarf.zig | |
| parent | 904ffb41de9caa3f8f99806518d719beef832b7c (diff) | |
| download | zig-72b4657053f94222c735b7c51c380649ce23c30e.tar.gz zig-72b4657053f94222c735b7c51c380649ce23c30e.zip | |
Dwarf: fix overflow write byte_size
Diffstat (limited to 'src/link/Dwarf.zig')
| -rw-r--r-- | src/link/Dwarf.zig | 94 |
1 files changed, 47 insertions, 47 deletions
diff --git a/src/link/Dwarf.zig b/src/link/Dwarf.zig index 2ec0dedc6f..c134f60316 100644 --- a/src/link/Dwarf.zig +++ b/src/link/Dwarf.zig @@ -184,12 +184,14 @@ pub const DeclState = struct { try dbg_info_buffer.append(@enumToInt(AbbrevKind.pad1)); }, .Bool => { - try dbg_info_buffer.appendSlice(&[_]u8{ - @enumToInt(AbbrevKind.base_type), - DW.ATE.boolean, // DW.AT.encoding , DW.FORM.data1 - 1, // DW.AT.byte_size, DW.FORM.data1 - 'b', 'o', 'o', 'l', 0, // DW.AT.name, DW.FORM.string - }); + try dbg_info_buffer.ensureUnusedCapacity(12); + dbg_info_buffer.appendAssumeCapacity(@enumToInt(AbbrevKind.base_type)); + // DW.AT.encoding, DW.FORM.data1 + dbg_info_buffer.appendAssumeCapacity(DW.ATE.boolean); + // DW.AT.byte_size, DW.FORM.udata + try leb128.writeULEB128(dbg_info_buffer.writer(), ty.abiSize(target)); + // DW.AT.name, DW.FORM.string + try dbg_info_buffer.writer().print("{}\x00", .{ty.fmt(module)}); }, .Int => { const info = ty.intInfo(target); @@ -200,9 +202,9 @@ pub const DeclState = struct { .signed => DW.ATE.signed, .unsigned => DW.ATE.unsigned, }); - // DW.AT.byte_size, DW.FORM.data1 - dbg_info_buffer.appendAssumeCapacity(@intCast(u8, ty.abiSize(target))); - // DW.AT.name, DW.FORM.string + // DW.AT.byte_size, DW.FORM.udata + try leb128.writeULEB128(dbg_info_buffer.writer(), ty.abiSize(target)); + // DW.AT.name, DW.FORM.string try dbg_info_buffer.writer().print("{}\x00", .{ty.fmt(module)}); }, .Optional => { @@ -211,9 +213,9 @@ pub const DeclState = struct { dbg_info_buffer.appendAssumeCapacity(@enumToInt(AbbrevKind.base_type)); // DW.AT.encoding, DW.FORM.data1 dbg_info_buffer.appendAssumeCapacity(DW.ATE.address); - // DW.AT.byte_size, DW.FORM.data1 - dbg_info_buffer.appendAssumeCapacity(@intCast(u8, ty.abiSize(target))); - // DW.AT.name, DW.FORM.string + // DW.AT.byte_size, DW.FORM.udata + try leb128.writeULEB128(dbg_info_buffer.writer(), ty.abiSize(target)); + // DW.AT.name, DW.FORM.string try dbg_info_buffer.writer().print("{}\x00", .{ty.fmt(module)}); } else { // Non-pointer optionals are structs: struct { .maybe = *, .val = * } @@ -221,7 +223,7 @@ pub const DeclState = struct { const payload_ty = ty.optionalChild(buf); // DW.AT.structure_type try dbg_info_buffer.append(@enumToInt(AbbrevKind.struct_type)); - // DW.AT.byte_size, DW.FORM.sdata + // DW.AT.byte_size, DW.FORM.udata const abi_size = ty.abiSize(target); try leb128.writeULEB128(dbg_info_buffer.writer(), abi_size); // DW.AT.name, DW.FORM.string @@ -236,7 +238,7 @@ pub const DeclState = struct { var index = dbg_info_buffer.items.len; try dbg_info_buffer.resize(index + 4); try self.addTypeRelocGlobal(atom_index, Type.bool, @intCast(u32, index)); - // DW.AT.data_member_location, DW.FORM.sdata + // DW.AT.data_member_location, DW.FORM.udata try dbg_info_buffer.ensureUnusedCapacity(6); dbg_info_buffer.appendAssumeCapacity(0); // DW.AT.member @@ -248,7 +250,7 @@ pub const DeclState = struct { index = dbg_info_buffer.items.len; try dbg_info_buffer.resize(index + 4); try self.addTypeRelocGlobal(atom_index, payload_ty, @intCast(u32, index)); - // DW.AT.data_member_location, DW.FORM.sdata + // DW.AT.data_member_location, DW.FORM.udata const offset = abi_size - payload_ty.abiSize(target); try leb128.writeULEB128(dbg_info_buffer.writer(), offset); // DW.AT.structure_type delimit children @@ -263,8 +265,8 @@ pub const DeclState = struct { // DW.AT.structure_type try dbg_info_buffer.ensureUnusedCapacity(2); dbg_info_buffer.appendAssumeCapacity(@enumToInt(AbbrevKind.struct_type)); - // DW.AT.byte_size, DW.FORM.sdata - dbg_info_buffer.appendAssumeCapacity(ptr_bytes * 2); + // DW.AT.byte_size, DW.FORM.udata + try leb128.writeULEB128(dbg_info_buffer.writer(), ty.abiSize(target)); // DW.AT.name, DW.FORM.string try dbg_info_buffer.writer().print("{}\x00", .{ty.fmt(module)}); // DW.AT.member @@ -279,7 +281,7 @@ pub const DeclState = struct { var buf = try arena.create(Type.SlicePtrFieldTypeBuffer); const ptr_ty = ty.slicePtrFieldType(buf); try self.addTypeRelocGlobal(atom_index, ptr_ty, @intCast(u32, index)); - // DW.AT.data_member_location, DW.FORM.sdata + // DW.AT.data_member_location, DW.FORM.udata try dbg_info_buffer.ensureUnusedCapacity(6); dbg_info_buffer.appendAssumeCapacity(0); // DW.AT.member @@ -291,7 +293,7 @@ pub const DeclState = struct { index = dbg_info_buffer.items.len; try dbg_info_buffer.resize(index + 4); try self.addTypeRelocGlobal(atom_index, Type.usize, @intCast(u32, index)); - // DW.AT.data_member_location, DW.FORM.sdata + // DW.AT.data_member_location, DW.FORM.udata try dbg_info_buffer.ensureUnusedCapacity(2); dbg_info_buffer.appendAssumeCapacity(ptr_bytes); // DW.AT.structure_type delimit children @@ -329,9 +331,8 @@ pub const DeclState = struct { .Struct => blk: { // DW.AT.structure_type try dbg_info_buffer.append(@enumToInt(AbbrevKind.struct_type)); - // DW.AT.byte_size, DW.FORM.sdata - const abi_size = ty.abiSize(target); - try leb128.writeULEB128(dbg_info_buffer.writer(), abi_size); + // DW.AT.byte_size, DW.FORM.udata + try leb128.writeULEB128(dbg_info_buffer.writer(), ty.abiSize(target)); switch (ty.tag()) { .tuple, .anon_struct => { @@ -348,7 +349,7 @@ pub const DeclState = struct { var index = dbg_info_buffer.items.len; try dbg_info_buffer.resize(index + 4); try self.addTypeRelocGlobal(atom_index, field, @intCast(u32, index)); - // DW.AT.data_member_location, DW.FORM.sdata + // DW.AT.data_member_location, DW.FORM.udata const field_off = ty.structFieldOffset(field_index, target); try leb128.writeULEB128(dbg_info_buffer.writer(), field_off); } @@ -380,7 +381,7 @@ pub const DeclState = struct { var index = dbg_info_buffer.items.len; try dbg_info_buffer.resize(index + 4); try self.addTypeRelocGlobal(atom_index, field.ty, @intCast(u32, index)); - // DW.AT.data_member_location, DW.FORM.sdata + // DW.AT.data_member_location, DW.FORM.udata const field_off = ty.structFieldOffset(field_index, target); try leb128.writeULEB128(dbg_info_buffer.writer(), field_off); } @@ -393,9 +394,8 @@ pub const DeclState = struct { .Enum => { // DW.AT.enumeration_type try dbg_info_buffer.append(@enumToInt(AbbrevKind.enum_type)); - // DW.AT.byte_size, DW.FORM.sdata - const abi_size = ty.abiSize(target); - try leb128.writeULEB128(dbg_info_buffer.writer(), abi_size); + // DW.AT.byte_size, DW.FORM.udata + try leb128.writeULEB128(dbg_info_buffer.writer(), ty.abiSize(target)); // DW.AT.name, DW.FORM.string const enum_name = try ty.nameAllocArena(arena, module); try dbg_info_buffer.ensureUnusedCapacity(enum_name.len + 1); @@ -446,7 +446,7 @@ pub const DeclState = struct { if (is_tagged) { // DW.AT.structure_type try dbg_info_buffer.append(@enumToInt(AbbrevKind.struct_type)); - // DW.AT.byte_size, DW.FORM.sdata + // DW.AT.byte_size, DW.FORM.udata try leb128.writeULEB128(dbg_info_buffer.writer(), layout.abi_size); // DW.AT.name, DW.FORM.string try dbg_info_buffer.ensureUnusedCapacity(union_name.len + 1); @@ -463,13 +463,13 @@ pub const DeclState = struct { const inner_union_index = dbg_info_buffer.items.len; try dbg_info_buffer.resize(inner_union_index + 4); try self.addTypeRelocLocal(atom_index, @intCast(u32, inner_union_index), 5); - // DW.AT.data_member_location, DW.FORM.sdata + // DW.AT.data_member_location, DW.FORM.udata try leb128.writeULEB128(dbg_info_buffer.writer(), payload_offset); } // DW.AT.union_type try dbg_info_buffer.append(@enumToInt(AbbrevKind.union_type)); - // DW.AT.byte_size, DW.FORM.sdata, + // DW.AT.byte_size, DW.FORM.udata, try leb128.writeULEB128(dbg_info_buffer.writer(), layout.payload_size); // DW.AT.name, DW.FORM.string if (is_tagged) { @@ -490,7 +490,7 @@ pub const DeclState = struct { const index = dbg_info_buffer.items.len; try dbg_info_buffer.resize(index + 4); try self.addTypeRelocGlobal(atom_index, field.ty, @intCast(u32, index)); - // DW.AT.data_member_location, DW.FORM.sdata + // DW.AT.data_member_location, DW.FORM.udata try dbg_info_buffer.append(0); } // DW.AT.union_type delimit children @@ -507,7 +507,7 @@ pub const DeclState = struct { const index = dbg_info_buffer.items.len; try dbg_info_buffer.resize(index + 4); try self.addTypeRelocGlobal(atom_index, union_obj.tag_ty, @intCast(u32, index)); - // DW.AT.data_member_location, DW.FORM.sdata + // DW.AT.data_member_location, DW.FORM.udata try leb128.writeULEB128(dbg_info_buffer.writer(), tag_offset); // DW.AT.structure_type delimit children @@ -534,7 +534,7 @@ pub const DeclState = struct { // DW.AT.structure_type try dbg_info_buffer.append(@enumToInt(AbbrevKind.struct_type)); - // DW.AT.byte_size, DW.FORM.sdata + // DW.AT.byte_size, DW.FORM.udata try leb128.writeULEB128(dbg_info_buffer.writer(), abi_size); // DW.AT.name, DW.FORM.string const name = try ty.nameAllocArena(arena, module); @@ -551,7 +551,7 @@ pub const DeclState = struct { const index = dbg_info_buffer.items.len; try dbg_info_buffer.resize(index + 4); try self.addTypeRelocGlobal(atom_index, payload_ty, @intCast(u32, index)); - // DW.AT.data_member_location, DW.FORM.sdata + // DW.AT.data_member_location, DW.FORM.udata try leb128.writeULEB128(dbg_info_buffer.writer(), payload_off); } @@ -566,7 +566,7 @@ pub const DeclState = struct { const index = dbg_info_buffer.items.len; try dbg_info_buffer.resize(index + 4); try self.addTypeRelocGlobal(atom_index, error_ty, @intCast(u32, index)); - // DW.AT.data_member_location, DW.FORM.sdata + // DW.AT.data_member_location, DW.FORM.udata try leb128.writeULEB128(dbg_info_buffer.writer(), error_off); } @@ -647,8 +647,8 @@ pub const DeclState = struct { try dbg_info.ensureUnusedCapacity(5 + name_with_null.len); const index = dbg_info.items.len; - try dbg_info.resize(index + 4); // dw.at.type, dw.form.ref4 - try self.addTypeRelocGlobal(atom_index, ty, @intCast(u32, index)); // DW.AT.type, DW.FORM.ref4 + try dbg_info.resize(index + 4); // dw.at.type, dw.form.ref4 + try self.addTypeRelocGlobal(atom_index, ty, @intCast(u32, index)); // DW.AT.type, DW.FORM.ref4 dbg_info.appendSliceAssumeCapacity(name_with_null); // DW.AT.name, DW.FORM.string } @@ -790,7 +790,7 @@ pub const DeclState = struct { try dbg_info.ensureUnusedCapacity(5 + name_with_null.len); const index = dbg_info.items.len; - try dbg_info.resize(index + 4); // dw.at.type, dw.form.ref4 + try dbg_info.resize(index + 4); // dw.at.type, dw.form.ref4 try self.addTypeRelocGlobal(atom_index, child_ty, @intCast(u32, index)); dbg_info.appendSliceAssumeCapacity(name_with_null); // DW.AT.name, DW.FORM.string } @@ -993,13 +993,13 @@ pub fn initDeclState(self: *Dwarf, mod: *Module, decl_index: Module.Decl.Index) // "relocations" and have to be in this fixed place so that functions can be // moved in virtual address space. assert(dbg_info_low_pc_reloc_index == dbg_info_buffer.items.len); - dbg_info_buffer.items.len += ptr_width_bytes; // DW.AT.low_pc, DW.FORM.addr + dbg_info_buffer.items.len += ptr_width_bytes; // DW.AT.low_pc, DW.FORM.addr assert(self.getRelocDbgInfoSubprogramHighPC() == dbg_info_buffer.items.len); - dbg_info_buffer.items.len += 4; // DW.AT.high_pc, DW.FORM.data4 + dbg_info_buffer.items.len += 4; // DW.AT.high_pc, DW.FORM.data4 // if (fn_ret_has_bits) { try decl_state.addTypeRelocGlobal(di_atom_index, fn_ret_type, @intCast(u32, dbg_info_buffer.items.len)); - dbg_info_buffer.items.len += 4; // DW.AT.type, DW.FORM.ref4 + dbg_info_buffer.items.len += 4; // DW.AT.type, DW.FORM.ref4 } dbg_info_buffer.appendSliceAssumeCapacity(decl_name_with_null); // DW.AT.name, DW.FORM.string @@ -1619,7 +1619,7 @@ pub fn writeDbgAbbrev(self: *Dwarf) !void { DW.AT.encoding, DW.FORM.data1, DW.AT.byte_size, - DW.FORM.data1, + DW.FORM.udata, DW.AT.name, DW.FORM.string, 0, @@ -1635,7 +1635,7 @@ pub fn writeDbgAbbrev(self: *Dwarf) !void { DW.TAG.structure_type, DW.CHILDREN.yes, // header DW.AT.byte_size, - DW.FORM.sdata, + DW.FORM.udata, DW.AT.name, DW.FORM.string, 0, @@ -1648,14 +1648,14 @@ pub fn writeDbgAbbrev(self: *Dwarf) !void { DW.AT.type, DW.FORM.ref4, DW.AT.data_member_location, - DW.FORM.sdata, + DW.FORM.udata, 0, 0, // table sentinel @enumToInt(AbbrevKind.enum_type), DW.TAG.enumeration_type, DW.CHILDREN.yes, // header DW.AT.byte_size, - DW.FORM.sdata, + DW.FORM.udata, DW.AT.name, DW.FORM.string, 0, @@ -1673,7 +1673,7 @@ pub fn writeDbgAbbrev(self: *Dwarf) !void { DW.TAG.union_type, DW.CHILDREN.yes, // header DW.AT.byte_size, - DW.FORM.sdata, + DW.FORM.udata, DW.AT.name, DW.FORM.string, 0, @@ -2628,7 +2628,7 @@ fn addDbgInfoErrorSet( // DW.AT.enumeration_type try dbg_info_buffer.append(@enumToInt(AbbrevKind.enum_type)); - // DW.AT.byte_size, DW.FORM.sdata + // DW.AT.byte_size, DW.FORM.udata const abi_size = Type.anyerror.abiSize(target); try leb128.writeULEB128(dbg_info_buffer.writer(), abi_size); // DW.AT.name, DW.FORM.string |
