]> git.ipfire.org Git - thirdparty/ipxe.git/commitdiff
[hyperv] Fix resource leaks on error path
authorMichael Brown <mcb30@ipxe.org>
Tue, 21 Mar 2017 12:51:03 +0000 (14:51 +0200)
committerMichael Brown <mcb30@ipxe.org>
Tue, 21 Mar 2017 12:51:03 +0000 (14:51 +0200)
Signed-off-by: Michael Brown <mcb30@ipxe.org>
src/interface/hyperv/vmbus.c

index 286572ce024474716e391ae2c1b4c7256c0a0f15..7915ddfe03d1d5c88f8be3515c30d6ce937eb6b7 100644 (file)
@@ -448,28 +448,31 @@ int vmbus_open ( struct vmbus_device *vmdev,
        /* Post message */
        if ( ( rc = vmbus_post_message ( hv, &open.header,
                                         sizeof ( open ) ) ) != 0 )
-               return rc;
+               goto err_post_message;
 
        /* Wait for response */
        if ( ( rc = vmbus_wait_for_message ( hv,
                                             VMBUS_OPEN_CHANNEL_RESULT ) ) != 0)
-               return rc;
+               goto err_wait_for_message;
 
        /* Check response */
        if ( opened->channel != cpu_to_le32 ( vmdev->channel ) ) {
                DBGC ( vmdev, "VMBUS %s unexpected opened channel %#08x\n",
                       vmdev->dev.name, le32_to_cpu ( opened->channel ) );
-               return -EPROTO;
+               rc = -EPROTO;
+               goto err_check_response;
        }
        if ( opened->id != open_id /* Non-endian */ ) {
                DBGC ( vmdev, "VMBUS %s unexpected open ID %#08x\n",
                       vmdev->dev.name, le32_to_cpu ( opened->id ) );
-               return -EPROTO;
+               rc = -EPROTO;
+               goto err_check_response;
        }
        if ( opened->status != 0 ) {
                DBGC ( vmdev, "VMBUS %s open failed: %#08x\n",
                       vmdev->dev.name, le32_to_cpu ( opened->status ) );
-               return -EPROTO;
+               rc = -EPROTO;
+               goto err_check_response;
        }
 
        /* Store channel parameters */
@@ -488,6 +491,9 @@ int vmbus_open ( struct vmbus_device *vmdev,
                ( virt_to_phys ( vmdev->out ) + len ) );
        return 0;
 
+ err_check_response:
+ err_wait_for_message:
+ err_post_message:
        vmbus_gpadl_teardown ( vmdev, vmdev->gpadl );
  err_establish:
        free_dma ( ring, len );