From bb232024c00aa49c10181ed869a46e4827251495 Mon Sep 17 00:00:00 2001 From: asiva Date: Tue, 30 Jul 2024 18:08:46 +0000 Subject: [PATCH] [VM/io] Fix ASAN error (memory leak). https://github.com/dart-lang/sdk/issues/56299 TEST=ci Change-Id: I921c204c9b5b96094b5a872a0ffd8e3443ce0c50 Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/377780 Reviewed-by: Ryan Macnak Commit-Queue: Siva Annamalai --- runtime/bin/file.cc | 30 ++++++++++++++++++++++-------- 1 file changed, 22 insertions(+), 8 deletions(-) diff --git a/runtime/bin/file.cc b/runtime/bin/file.cc index 85effb1da28..70571e399ef 100644 --- a/runtime/bin/file.cc +++ b/runtime/bin/file.cc @@ -252,18 +252,28 @@ void FUNCTION_NAME(File_ReadInto)(Dart_NativeArguments args) { } int64_t bytes_read = file->Read(reinterpret_cast(buffer), length); - OSError os_error; // capture error if any + OSError* os_error = new OSError(); // capture error if any if (is_byte_data) { - ThrowIfError(Dart_TypedDataReleaseData(buffer_obj)); + Dart_Handle handle = Dart_TypedDataReleaseData(buffer_obj); + if (Dart_IsError(handle)) { + delete os_error; + Dart_PropagateError(handle); + } } if (bytes_read >= 0) { if (!is_byte_data) { - ThrowIfError(Dart_ListSetAsBytes(buffer_obj, start, buffer, bytes_read)); + Dart_Handle handle = + Dart_ListSetAsBytes(buffer_obj, start, buffer, bytes_read); + if (Dart_IsError(handle)) { + delete os_error; + Dart_PropagateError(handle); + } } Dart_SetIntegerReturnValue(args, bytes_read); } else { - Dart_SetReturnValue(args, DartUtils::NewDartOSError(&os_error)); + Dart_SetReturnValue(args, DartUtils::NewDartOSError(os_error)); } + delete os_error; } void FUNCTION_NAME(File_WriteFrom)(Dart_NativeArguments args) { @@ -296,16 +306,20 @@ void FUNCTION_NAME(File_WriteFrom)(Dart_NativeArguments args) { // Write all the data out into the file. char* byte_buffer = reinterpret_cast(buffer); bool success = file->WriteFully(byte_buffer + start, length); - OSError os_error; // capture error if any + OSError* os_error = new OSError(); // capture error if any // Release the direct pointer acquired above. - ThrowIfError(Dart_TypedDataReleaseData(buffer_obj)); - + result = Dart_TypedDataReleaseData(buffer_obj); + if (Dart_IsError(result)) { + delete os_error; + Dart_PropagateError(result); + } if (!success) { - Dart_SetReturnValue(args, DartUtils::NewDartOSError(&os_error)); + Dart_SetReturnValue(args, DartUtils::NewDartOSError(os_error)); } else { Dart_SetReturnValue(args, Dart_Null()); } + delete os_error; } void FUNCTION_NAME(File_Position)(Dart_NativeArguments args) {