Commit 336ccc31 authored by Nam Cao's avatar Nam Cao Committed by Greg Kroah-Hartman
Browse files

staging: rtl8712: fix potential memory leak



In r8712_init_drv_sw(), whenever any function call returns error, it is
returned immediately without properly cleaning up the other successfully
executed functions. This can cause memory leak.

Instead of return immediately, free all the allocated buffers first.

Tested-by: default avatarPhilipp Hortmann <philipp.g.hortmann@gmail.com>
Signed-off-by: default avatarNam Cao <namcaov@gmail.com>
Link: https://lore.kernel.org/r/0a3414b12031f6cdcba81a8725e91eb9567ff34f.1666688642.git.namcaov@gmail.com


Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent 24244343
Loading
Loading
Loading
Loading
+18 −5
Original line number Diff line number Diff line
@@ -304,29 +304,42 @@ int r8712_init_drv_sw(struct _adapter *padapter)
	padapter->cmdpriv.padapter = padapter;
	ret = r8712_init_evt_priv(&padapter->evtpriv);
	if (ret)
		return ret;
		goto free_cmd;
	ret = r8712_init_mlme_priv(padapter);
	if (ret)
		return ret;
		goto free_evt;
	ret = _r8712_init_xmit_priv(&padapter->xmitpriv, padapter);
	if (ret)
		return ret;
		goto free_mlme;
	ret = _r8712_init_recv_priv(&padapter->recvpriv, padapter);
	if (ret)
		return ret;
		goto free_xmit;
	memset((unsigned char *)&padapter->securitypriv, 0,
	       sizeof(struct security_priv));
	timer_setup(&padapter->securitypriv.tkip_timer,
		    r8712_use_tkipkey_handler, 0);
	ret = _r8712_init_sta_priv(&padapter->stapriv);
	if (ret)
		return ret;
		goto free_recv;
	padapter->stapriv.padapter = padapter;
	r8712_init_bcmc_stainfo(padapter);
	r8712_init_pwrctrl_priv(padapter);
	mp871xinit(padapter);
	init_default_value(padapter);
	r8712_InitSwLeds(padapter);

	return 0;

free_recv:
	_r8712_free_recv_priv(&padapter->recvpriv);
free_xmit:
	_free_xmit_priv(&padapter->xmitpriv);
free_mlme:
	r8712_free_mlme_priv(&padapter->mlmepriv);
free_evt:
	r8712_free_evt_priv(&padapter->evtpriv);
free_cmd:
	r8712_free_cmd_priv(&padapter->cmdpriv);
	return ret;
}