commit d1e38c3868005fe442299772d84306c7960571f6
parent b94efcdfe4f3304c6ea9de1da665ef3e3ff3c29c
Author: Jack Mordaunt <jackmordaunt.dev@gmail.com>
Date: Tue, 26 Oct 2021 15:48:12 +0800
nativeaudio: [fix] free errors
ErrorFree was failing because it was trying to free `const * char`
string literals which were never dynamically allocated.
Signed-off-by: Jack Mordaunt <jackmordaunt.dev@gmail.com>
Diffstat:
2 files changed, 7 insertions(+), 12 deletions(-)
diff --git a/audio_windows.c b/audio_windows.c
@@ -31,20 +31,15 @@ ErrorWithCode(Error *err, int code)
}
// ErrorFree deallocates the error and any wrapped errors.
-// BUG: heap corruption.
void
ErrorFree(Error* err)
{
- // cursor points to the error currently being processed.
- Error *cursor = NULL;
-
+ Error *tmp = NULL;
while (err != NULL)
{
- cursor = err;
- if (cursor->Str != NULL)
- free(cursor->Str);
- free(cursor);
+ tmp = err;
err = err->Err;
+ free(tmp);
}
}
diff --git a/audio_windows.go b/audio_windows.go
@@ -25,8 +25,8 @@ func play(path string) error {
defer C.free(unsafe.Pointer(cPath))
err := C.Play(cPath)
if err != nil {
- defer C.free(unsafe.Pointer(err))
- return fmt.Errorf(C.GoString(err.Str))
+ defer C.ErrorFree(err)
+ return collectErrors(err)
}
return nil
}
@@ -42,7 +42,7 @@ func load(path string) ([]byte, Format, error) {
defer C.free(unsafe.Pointer(cPath))
r := C.Load(cPath)
if r.Err != nil {
- // defer C.ErrorFree(result.Err)
+ defer C.ErrorFree(r.Err)
return nil, Format{}, collectErrors(r.Err)
}
defer C.BufferFree(r.Uncompressed)
@@ -63,7 +63,7 @@ func decode(compressed []byte) (uncompressed []byte, format Format, err error) {
defer runtime.KeepAlive(compressed)
r := C.Decode((*C.uchar)(C.CBytes(compressed)), C.uint(len(compressed)))
if r.Err != nil && r.Err.Str != nil {
- // TODO(jfm): Free result.
+ defer C.ErrorFree(r.Err)
return nil, format, collectErrors(r.Err)
}
defer C.BufferFree(r.Uncompressed)