mirror of
https://github.com/IllusionMan1212/flac-odin.git
synced 2026-10-24 02:12:29 +00:00
fix: get rid of a use-after-free bug that happens when using the default heap allocator
This commit is contained in:
+48
@@ -0,0 +1,48 @@
|
||||
package flac
|
||||
|
||||
import "core:io"
|
||||
|
||||
// Buffer is a very minimal writable buffer based on bytes.Buffer
|
||||
Buffer :: struct {
|
||||
buf: [dynamic]byte,
|
||||
}
|
||||
|
||||
buffer_init_allocator :: proc(b: ^Buffer, len, cap: int, allocator := context.allocator, loc := #caller_location) {
|
||||
b.buf = make([dynamic]byte, len, cap, allocator, loc)
|
||||
}
|
||||
|
||||
buffer_write :: proc(b: ^Buffer, p: []byte) -> (n: int, err: io.Error) {
|
||||
return append(&b.buf, ..p), nil
|
||||
}
|
||||
|
||||
buffer_destroy :: proc(b: ^Buffer) {
|
||||
delete(b.buf)
|
||||
}
|
||||
|
||||
buffer_to_bytes :: proc(b: ^Buffer) -> []byte {
|
||||
return b.buf[:]
|
||||
}
|
||||
|
||||
buffer_to_stream :: proc(b: ^Buffer) -> (s: io.Stream) {
|
||||
s.data = b
|
||||
s.procedure = _buffer_proc
|
||||
return
|
||||
}
|
||||
|
||||
@(private)
|
||||
_buffer_proc :: proc(stream_data: rawptr, mode: io.Stream_Mode, p: []byte, offset: i64, whence: io.Seek_From) -> (n: i64, err: io.Error) {
|
||||
b := (^Buffer)(stream_data)
|
||||
#partial switch mode {
|
||||
case .Write:
|
||||
return io._i64_err(buffer_write(b, p))
|
||||
case .Size:
|
||||
n = i64(cap(b.buf))
|
||||
return
|
||||
case .Destroy:
|
||||
buffer_destroy(b)
|
||||
return
|
||||
case .Query:
|
||||
return io.query_utility({.Write, .Size, .Destroy})
|
||||
}
|
||||
return 0, .Empty
|
||||
}
|
||||
Reference in New Issue
Block a user