lkml.org 
[lkml]   [2012]   [Nov]   [26]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 236/270] Drivers: hv: Cleanup error handling in vmbus_open()
    Date
    3.5.7u1 -stable review patch.  If anyone has any objections, please let me know.

    ------------------

    From: "K. Y. Srinivasan" <kys@microsoft.com>

    commit 1392550240aaa72ce3a094a38bd23525cd67ce60 upstream.

    Fix a memory leak in the error handling path in the function vmbus_open().

    Signed-off-by: K. Y. Srinivasan <kys@microsoft.com>
    Reviewed-by: Haiyang Zhang <haiyangz@microsoft.com>
    Reported-by: Jason Wang <jasowang@redhat.com>
    Acked-by: Jason Wang <jasowang@redhat.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
    Signed-off-by: Herton Ronaldo Krzesinski <herton.krzesinski@canonical.com>
    ---
    drivers/hv/channel.c | 24 +++++++++++++-----------
    1 file changed, 13 insertions(+), 11 deletions(-)

    diff --git a/drivers/hv/channel.c b/drivers/hv/channel.c
    index 4065374..f4c3d28 100644
    --- a/drivers/hv/channel.c
    +++ b/drivers/hv/channel.c
    @@ -146,14 +146,14 @@ int vmbus_open(struct vmbus_channel *newchannel, u32 send_ringbuffer_size,

    if (ret != 0) {
    err = ret;
    - goto errorout;
    + goto error0;
    }

    ret = hv_ringbuffer_init(
    &newchannel->inbound, in, recv_ringbuffer_size);
    if (ret != 0) {
    err = ret;
    - goto errorout;
    + goto error0;
    }


    @@ -168,7 +168,7 @@ int vmbus_open(struct vmbus_channel *newchannel, u32 send_ringbuffer_size,

    if (ret != 0) {
    err = ret;
    - goto errorout;
    + goto error0;
    }

    /* Create and init the channel open message */
    @@ -177,7 +177,7 @@ int vmbus_open(struct vmbus_channel *newchannel, u32 send_ringbuffer_size,
    GFP_KERNEL);
    if (!open_info) {
    err = -ENOMEM;
    - goto errorout;
    + goto error0;
    }

    init_completion(&open_info->waitevent);
    @@ -193,7 +193,7 @@ int vmbus_open(struct vmbus_channel *newchannel, u32 send_ringbuffer_size,

    if (userdatalen > MAX_USER_DEFINED_BYTES) {
    err = -EINVAL;
    - goto errorout;
    + goto error0;
    }

    if (userdatalen)
    @@ -208,19 +208,18 @@ int vmbus_open(struct vmbus_channel *newchannel, u32 send_ringbuffer_size,
    sizeof(struct vmbus_channel_open_channel));

    if (ret != 0)
    - goto cleanup;
    + goto error1;

    t = wait_for_completion_timeout(&open_info->waitevent, 5*HZ);
    if (t == 0) {
    err = -ETIMEDOUT;
    - goto errorout;
    + goto error1;
    }


    if (open_info->response.open_result.status)
    err = open_info->response.open_result.status;

    -cleanup:
    spin_lock_irqsave(&vmbus_connection.channelmsg_lock, flags);
    list_del(&open_info->msglistentry);
    spin_unlock_irqrestore(&vmbus_connection.channelmsg_lock, flags);
    @@ -228,9 +227,12 @@ cleanup:
    kfree(open_info);
    return err;

    -errorout:
    - hv_ringbuffer_cleanup(&newchannel->outbound);
    - hv_ringbuffer_cleanup(&newchannel->inbound);
    +error1:
    + spin_lock_irqsave(&vmbus_connection.channelmsg_lock, flags);
    + list_del(&open_info->msglistentry);
    + spin_unlock_irqrestore(&vmbus_connection.channelmsg_lock, flags);
    +
    +error0:
    free_pages((unsigned long)out,
    get_order(send_ringbuffer_size + recv_ringbuffer_size));
    kfree(open_info);
    --
    1.7.9.5


    \
     
     \ /
      Last update: 2012-11-26 19:21    [W:4.133 / U:0.148 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site