2
0
mirror of https://github.com/edk2-porting/linux-next.git synced 2025-01-18 18:43:59 +08:00

staging: rtl8188eu: fix potential leak in rtw_mp_pwrtrk()

Function rtw_mp_pwrtrk() dynamically allocates a temporary buffer that
is not freed in all error paths. Use a centralized exit path and make sure
that all memory is freed correctly. Detected by Coverity - 1077715.

Signed-off-by: Christian Engelmayer <cengelma@gmx.at>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
Christian Engelmayer 2014-05-07 21:34:37 +02:00 committed by Greg Kroah-Hartman
parent c98acd000b
commit e0e2c5cde5

View File

@ -7119,15 +7119,15 @@ static int rtw_mp_pwrtrk(struct net_device *dev,
{
u8 enable;
u32 thermal;
s32 ret;
struct adapter *padapter = rtw_netdev_priv(dev);
char *input = kmalloc(wrqu->length, GFP_KERNEL);
int ret = 0;
if (!input)
return -ENOMEM;
if (copy_from_user(input, wrqu->pointer, wrqu->length)) {
kfree(input);
return -EFAULT;
ret = -EFAULT;
goto exit;
}
_rtw_memset(extra, 0, wrqu->length);
@ -7138,22 +7138,28 @@ static int rtw_mp_pwrtrk(struct net_device *dev,
sprintf(extra, "mp tx power tracking stop");
} else if (sscanf(input, "ther =%d", &thermal)) {
ret = Hal_SetThermalMeter(padapter, (u8)thermal);
if (ret == _FAIL)
return -EPERM;
if (ret == _FAIL) {
ret = -EPERM;
goto exit;
}
sprintf(extra, "mp tx power tracking start, target value =%d ok ", thermal);
} else {
kfree(input);
return -EINVAL;
ret = -EINVAL;
goto exit;
}
}
kfree(input);
ret = Hal_SetPowerTracking(padapter, enable);
if (ret == _FAIL)
return -EPERM;
if (ret == _FAIL) {
ret = -EPERM;
goto exit;
}
wrqu->length = strlen(extra);
return 0;
exit:
kfree(input);
return ret;
}
static int rtw_mp_psd(struct net_device *dev,