mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-10-02 15:18:19 +00:00
rpmsg: glink: Fix memory leak in qcom_glink_alloc_intent()
We need to free "intent" and "intent->data" on a couple error paths.
Fixes: 933b45da5d
("rpmsg: glink: Add support for TX intents")
Acked-by: Sricharan R <sricharan@codeaurora.org>
Signed-off-by: Dan Carpenter <dan.carpenter@oracle.com>
Signed-off-by: Bjorn Andersson <bjorn.andersson@linaro.org>
This commit is contained in:
parent
0a7480bd32
commit
b775d15853
1 changed files with 8 additions and 3 deletions
|
@ -635,19 +635,18 @@ qcom_glink_alloc_intent(struct qcom_glink *glink,
|
||||||
unsigned long flags;
|
unsigned long flags;
|
||||||
|
|
||||||
intent = kzalloc(sizeof(*intent), GFP_KERNEL);
|
intent = kzalloc(sizeof(*intent), GFP_KERNEL);
|
||||||
|
|
||||||
if (!intent)
|
if (!intent)
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
intent->data = kzalloc(size, GFP_KERNEL);
|
intent->data = kzalloc(size, GFP_KERNEL);
|
||||||
if (!intent->data)
|
if (!intent->data)
|
||||||
return NULL;
|
goto free_intent;
|
||||||
|
|
||||||
spin_lock_irqsave(&channel->intent_lock, flags);
|
spin_lock_irqsave(&channel->intent_lock, flags);
|
||||||
ret = idr_alloc_cyclic(&channel->liids, intent, 1, -1, GFP_ATOMIC);
|
ret = idr_alloc_cyclic(&channel->liids, intent, 1, -1, GFP_ATOMIC);
|
||||||
if (ret < 0) {
|
if (ret < 0) {
|
||||||
spin_unlock_irqrestore(&channel->intent_lock, flags);
|
spin_unlock_irqrestore(&channel->intent_lock, flags);
|
||||||
return NULL;
|
goto free_data;
|
||||||
}
|
}
|
||||||
spin_unlock_irqrestore(&channel->intent_lock, flags);
|
spin_unlock_irqrestore(&channel->intent_lock, flags);
|
||||||
|
|
||||||
|
@ -656,6 +655,12 @@ qcom_glink_alloc_intent(struct qcom_glink *glink,
|
||||||
intent->reuse = reuseable;
|
intent->reuse = reuseable;
|
||||||
|
|
||||||
return intent;
|
return intent;
|
||||||
|
|
||||||
|
free_data:
|
||||||
|
kfree(intent->data);
|
||||||
|
free_intent:
|
||||||
|
kfree(intent);
|
||||||
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void qcom_glink_handle_rx_done(struct qcom_glink *glink,
|
static void qcom_glink_handle_rx_done(struct qcom_glink *glink,
|
||||||
|
|
Loading…
Reference in a new issue