mirror of
https://codeberg.org/ziglang/zig.git
synced 2025-12-06 13:54:21 +00:00
Io.Writer fix dangling pointer
While underlying writer is Allocating writer buffer can grow in vtable.drain call. We should not hold pointer to the buffer before that call and use it after. This remembers positions instead of holding reference.
This commit is contained in:
parent
3ee4252183
commit
6219c015d8
1 changed files with 7 additions and 6 deletions
|
|
@ -317,13 +317,14 @@ test "fixed buffer flush" {
|
||||||
/// Calls `VTable.drain` but hides the last `preserve_len` bytes from the
|
/// Calls `VTable.drain` but hides the last `preserve_len` bytes from the
|
||||||
/// implementation, keeping them buffered.
|
/// implementation, keeping them buffered.
|
||||||
pub fn drainPreserve(w: *Writer, preserve_len: usize) Error!void {
|
pub fn drainPreserve(w: *Writer, preserve_len: usize) Error!void {
|
||||||
const temp_end = w.end -| preserve_len;
|
const preserved_head = w.end -| preserve_len;
|
||||||
const preserved = w.buffer[temp_end..w.end];
|
const preserved_tail = w.end;
|
||||||
w.end = temp_end;
|
const preserved_len = preserved_tail - preserved_head;
|
||||||
defer w.end += preserved.len;
|
w.end = preserved_head;
|
||||||
|
defer w.end += preserved_len;
|
||||||
assert(0 == try w.vtable.drain(w, &.{""}, 1));
|
assert(0 == try w.vtable.drain(w, &.{""}, 1));
|
||||||
assert(w.end <= temp_end + preserved.len);
|
assert(w.end <= preserved_head + preserved_len);
|
||||||
@memmove(w.buffer[w.end..][0..preserved.len], preserved);
|
@memmove(w.buffer[w.end..][0..preserved_len], w.buffer[preserved_head..preserved_tail]);
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn unusedCapacitySlice(w: *const Writer) []u8 {
|
pub fn unusedCapacitySlice(w: *const Writer) []u8 {
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue