authorgravatar for lgustaf1@binghamton.eduLayne Gustafson <lgustaf1@binghamton.edu> 2020-01-16 15:26:53-05:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2020-01-19 20:53:20-05:00
log35c681b7b18df1f8679457975f9dcfc6a4a53468
tree0a6826b835a11f0947ef67a9fd2004df6c8f0c7f
parent8902f3ca32c22656e1f11b562dc3ad6030da14ac
signaturelock-open Commit is signed but in an unrecognized format.

Fix sentinel mismatch in llvm strings

Previously, buffers were used with toOwnedSlice() to create c strings for LLVM cpu/feature strings. However, toOwnedSlice() shrinks the string memory to the buffer's length, which cuts off the null terminator. Now toSliceConst() is used instead, and the buffer is not deinited so that the string memory is not freed.

1 files changed, 5 insertions(+), 10 deletions(-)

src-self-hosted/stage1.zig+5-10
...@@ -643,20 +643,20 @@ const Stage2TargetDetails = struct {...@@ -643,20 +643,20 @@ const Stage2TargetDetails = struct {
643 var builtin_str_buffer = try std.Buffer.init(643 var builtin_str_buffer = try std.Buffer.init(
644 allocator,644 allocator,
645 "@import(\"std\").target.TargetDetails{.cpu=&@import(\"std\").target.");645 "@import(\"std\").target.TargetDetails{.cpu=&@import(\"std\").target.");
646 defer builtin_str_buffer.deinit();
647646
648 try builtin_str_buffer.append(@tagName(arch));647 try builtin_str_buffer.append(@tagName(arch));
649 try builtin_str_buffer.append(".cpu_");648 try builtin_str_buffer.append(".cpu_");
650 try builtin_str_buffer.append(cpu.name);649 try builtin_str_buffer.append(cpu.name);
651 try builtin_str_buffer.append("};");650 try builtin_str_buffer.append("};");
651
652 return Self{652 return Self{
653 .allocator = allocator,653 .allocator = allocator,
654 .target_details = .{654 .target_details = .{
655 .cpu = cpu,655 .cpu = cpu,
656 },656 },
657 .llvm_cpu_str = try toNullTerminatedStringAlloc(allocator, cpu.name),657 .llvm_cpu_str = try toNullTerminatedStringAlloc(allocator, cpu.llvm_name),
658 .llvm_features_str = null_terminated_empty_string,658 .llvm_features_str = null_terminated_empty_string,
659 .builtin_str = builtin_str_buffer.toOwnedSlice(),659 .builtin_str = builtin_str_buffer.toSliceConst(),
660 };660 };
661 }661 }
662662
...@@ -664,10 +664,8 @@ const Stage2TargetDetails = struct {...@@ -664,10 +664,8 @@ const Stage2TargetDetails = struct {
664 var builtin_str_buffer = try std.Buffer.init(664 var builtin_str_buffer = try std.Buffer.init(
665 allocator, 665 allocator,
666 "@import(\"std\").target.TargetDetails{.features=&[_]*const @import(\"std\").target.Feature{\n");666 "@import(\"std\").target.TargetDetails{.features=&[_]*const @import(\"std\").target.Feature{\n");
667 defer builtin_str_buffer.deinit();
668667
669 var llvm_features_buffer = try std.Buffer.initSize(allocator, 0);668 var llvm_features_buffer = try std.Buffer.initSize(allocator, 0);
670 defer llvm_features_buffer.deinit();
671669
672 // First, disable all features.670 // First, disable all features.
673 // This way, we only get the ones the user requests.671 // This way, we only get the ones the user requests.
...@@ -691,17 +689,14 @@ const Stage2TargetDetails = struct {...@@ -691,17 +689,14 @@ const Stage2TargetDetails = struct {
691689
692 try builtin_str_buffer.append("}};");690 try builtin_str_buffer.append("}};");
693691
694 // This is needed here because llvm_features_buffer.len() is no longer valid after toOwnedSlice().
695 const llvm_features_buffer_len = llvm_features_buffer.len();
696
697 return Self{692 return Self{
698 .allocator = allocator,693 .allocator = allocator,
699 .target_details = std.target.TargetDetails{694 .target_details = std.target.TargetDetails{
700 .features = features,695 .features = features,
701 },696 },
702 .llvm_cpu_str = null_terminated_empty_string,697 .llvm_cpu_str = null_terminated_empty_string,
703 .llvm_features_str = llvm_features_buffer.toOwnedSlice()[0..llvm_features_buffer_len :0],698 .llvm_features_str = llvm_features_buffer.toSliceConst(),
704 .builtin_str = builtin_str_buffer.toOwnedSlice(),699 .builtin_str = builtin_str_buffer.toSliceConst(),
705 };700 };
706 }701 }
707};702};