[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 <rmacnak@google.com>
Commit-Queue: Siva Annamalai <asiva@google.com>
This commit is contained in:
asiva
2024-07-30 18:08:46 +00:00
committed by Commit Queue
parent 6dc203f192
commit bb232024c0
+22 -8
View File
@@ -252,18 +252,28 @@ void FUNCTION_NAME(File_ReadInto)(Dart_NativeArguments args) {
}
int64_t bytes_read = file->Read(reinterpret_cast<void*>(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<char*>(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) {