Преглед изворни кода

manager: fix memory leak with error

osy пре 4 година
родитељ
комит
a542f8716f

+ 2 - 2
Managers/UTMQemuManager+BlockDevices.m

@@ -21,7 +21,7 @@
 
 @interface UTMQemuManager ()
 
-- (NSError *)errorForQerror:(Error *)qerr;
+- (__autoreleasing NSError *)errorForQerror:(Error *)qerr;
 
 @end
 
@@ -74,7 +74,7 @@
     return YES;
 }
 
-- (BOOL)changeMediumForDrive:(NSString *)drive path:(NSString *)path error:(NSError * _Nullable *)error {
+- (BOOL)changeMediumForDrive:(NSString *)drive path:(NSString *)path error:(NSError * _Nullable __autoreleasing *)error {
     Error *qerr = NULL;
     qmp_blockdev_change_medium(true, [drive cStringUsingEncoding:NSUTF8StringEncoding], false, NULL, [path cStringUsingEncoding:NSUTF8StringEncoding], false, NULL, false, BLOCKDEV_CHANGE_READ_ONLY_MODE_RETAIN, &qerr, (__bridge void *)self);
     if (qerr) {

+ 1 - 1
Managers/UTMQemuManager.m

@@ -228,7 +228,7 @@ void qmp_rpc_call(CFDictionaryRef args, CFDictionaryRef *ret, Error **err, void
     }];
 }
 
-- (NSError *)errorForQerror:(Error *)qerr {
+- (__autoreleasing NSError *)errorForQerror:(Error *)qerr {
     return [NSError errorWithDomain:kUTMErrorDomain code:-1 userInfo:@{NSLocalizedDescriptionKey: [NSString stringWithCString:error_get_pretty(qerr) encoding:NSASCIIStringEncoding]}];
 }
 

+ 4 - 4
Managers/UTMVirtualMachine+Drives.m

@@ -99,6 +99,7 @@ extern NSString *const kUTMErrorDomain;
 
 - (BOOL)changeMediumForDriveInternal:(UTMDrive *)drive bookmark:(NSData *)bookmark securityScoped:(BOOL)securityScoped error:(NSError * _Nullable __autoreleasing *)error {
     __block BOOL ret = NO;
+    __block NSError *qemuError = nil;
     dispatch_semaphore_t sema = dispatch_semaphore_create(0);
     [self.system accessDataWithBookmark:bookmark
                          securityScoped:securityScoped
@@ -106,16 +107,15 @@ extern NSString *const kUTMErrorDomain;
         if (success) {
             [self.viewState setBookmark:newBookmark path:path forRemovableDrive:drive.name persistent:YES];
             [self saveViewState];
-            [self.qemu changeMediumForDrive:drive.name path:path error:error];
+            success = [self.qemu changeMediumForDrive:drive.name path:path error:&qemuError];
         } else {
-            if (error) {
-                *error = [NSError errorWithDomain:kUTMErrorDomain code:-1 userInfo:@{NSLocalizedDescriptionKey: NSLocalizedString(@"Failed to access drive image path.", "UTMVirtualMachine+Drives")}];
-            }
+            qemuError = [NSError errorWithDomain:kUTMErrorDomain code:-1 userInfo:@{NSLocalizedDescriptionKey: NSLocalizedString(@"Failed to access drive image path.", "UTMVirtualMachine+Drives")}];
         }
         ret = success;
         dispatch_semaphore_signal(sema);
     }];
     dispatch_semaphore_wait(sema, DISPATCH_TIME_FOREVER);
+    *error = qemuError;
     return ret;
 }
 

+ 1 - 1
Managers/UTMVirtualMachine.m

@@ -605,7 +605,7 @@ error:
 // this is called right before we execute qmp_cont so we can setup additional option
 - (void)qemuQmpDidConnect:(UTMQemuManager *)manager {
     UTMLog(@"qemuQmpDidConnect");
-    NSError *err = nil;
+    __autoreleasing NSError *err = nil;
     NSString *errMsg = nil;
     if (!self.configuration.displayConsoleOnly) {
         if (![self startSharedDirectoryWithError:&err]) {