Skip to contentSkip to conversation

staging: r8188eu: handle rtw_init_netdev_name() failure appropriately

PATCH In review Vihas Mak 2 participants 3 messages Jan 23, 2022 – Jan 24, 2022 Staging

lore
Share & tools
lore

Vihas Mak

author
#0 lore raw

PATCH v2 1/1 staging: r8188eu: handle rtw_init_netdev_name() failure appropriately

rtw_init_netdev_name() calls dev_alloc_name() which allocates the name for the device as per the given name format.
The name format is specified by the module parameter "ifname". It returns a negative err code if the format is invalid. Handle this error appropriately.
Cancel the timers ininitliazed by rtw_init_drv_sw() before calling rtw_free_drv_sw() and then proceed to free the adapter.

Also, if register_netdev() fails then goto free_drv_sw instead of goto handle_dualmac.

---
v1->v2:
free the adapter and netdev instead of warning the user about allocation failure.

 drivers/staging/r8188eu/os_dep/usb_intf.c | 13 +++++++++++--
 1 file changed, 11 insertions(+), 2 deletions(-)
drivers/staging/r8188eu/os_dep/usb_intf.c +11 -2
index 91792dfd3..85b5d0bd7 100644
@@ -399,7 +399,11 @@ static struct adapter *rtw_usb_if1_init(struct dvobj_priv *dvobj,
 			DBG_88E("can't get autopm:\n");
 
 	/*  alloc dev name after read efuse. */
-	rtw_init_netdev_name(pnetdev, padapter->registrypriv.ifname);
+	if (rtw_init_netdev_name(pnetdev, padapter->registrypriv.ifname) < 0) {
+		DBG_88E("rtw_init_netdev_name failed, ifname:%s\n",
+			padapter->registrypriv.ifname);
+		goto free_drv_sw;
+	}
 	rtw_macaddr_cfg(padapter->eeprompriv.mac_addr);
 	rtw_init_wifidirect_addrs(padapter, padapter->eeprompriv.mac_addr,
 				  padapter->eeprompriv.mac_addr);
@@ -409,7 +413,7 @@ static struct adapter *rtw_usb_if1_init(struct dvobj_priv *dvobj,
 
 	/* step 6. Tell the network stack we exist */
 	if (register_netdev(pnetdev) != 0)
-		goto handle_dualmac;
+		goto free_drv_sw;
 
 	DBG_88E("bDriverStopped:%d, bSurpriseRemoved:%d, bup:%d, hw_init_completed:%d\n"
 		, padapter->bDriverStopped
@@ -420,6 +424,11 @@ static struct adapter *rtw_usb_if1_init(struct dvobj_priv *dvobj,
 
 	status = _SUCCESS;
 
+free_drv_sw:
+	if (status != _SUCCESS) {
+		rtw_cancel_all_timer(padapter);
+		rtw_free_drv_sw(padapter);
+	}
 handle_dualmac:
 	if (status != _SUCCESS)
 		rtw_handle_dualmac(padapter, 0);
Signature · 1 line
2.30.2
Reviewed-by on v2 1/1
#1 lore raw
Quoted 8 lines · Vihas Mak

rtw_init_netdev_name() calls dev_alloc_name() which allocates the name for the device as per the given name format.
The name format is specified by the module parameter "ifname". It returns a negative err code if the format is invalid. Handle this error appropriately.
Cancel the timers ininitliazed by rtw_init_drv_sw() before calling rtw_free_drv_sw() and then proceed to free the adapter.

Quoted 8 lines

Also, if register_netdev() fails then goto free_drv_sw instead of goto handle_dualmac.

---
v1->v2:
free the adapter and netdev instead of warning the user about allocation failure.

Thanks!

Of course, all this code is staging code and terrible. This function is needlessly difficult to read/review.

TODO: re-write probe error handling

Step 1: Keep the success path and error path separate.

- status = _SUCCESS;
+ return padapter;

Step 2: Eliminate do-nothing-gotos. s/goto exit/return NULL/

Step 3: Delete the vfree(pnpi->priv); from rtw_free_netdev() and call
vfree(pnpi->priv); from probe and rtw_usb_if1_deinit() instead. Avoid a layering violation.

Step 4: Every allocation function needs a matching free function. Move
the rtw_cancel_all_timer() into the rtw_free_drv_sw() function. Open coding it is a layering violation.

Step 5: Get rid of the rtw_handle_dualmac() function. It has a bad
name and a global variable. What is the point of this function?

But that stuff is for later patches.

regards,
dan carpenter

author
#2 lore raw

Thanks for reviewing the patch Dan.

Quoted 1 line
Quoted 1 line

TODO: re-write probe error handling

Will submit a series of patches in upcoming days, based on the steps you provided.

Quoted 51 lines · Dan Carpenter
Quoted 8 lines · Vihas Mak

rtw_init_netdev_name() calls dev_alloc_name() which allocates the name for the device as per the given name format.
The name format is specified by the module parameter "ifname". It returns a negative err code if the format is invalid. Handle this error appropriately.
Cancel the timers ininitliazed by rtw_init_drv_sw() before calling rtw_free_drv_sw() and then proceed to free the adapter.

Quoted 8 lines

Also, if register_netdev() fails then goto free_drv_sw instead of goto handle_dualmac.

---
v1->v2:
free the adapter and netdev instead of warning the user about allocation failure.

Thanks!

Of course, all this code is staging code and terrible. This function is needlessly difficult to read/review.

TODO: re-write probe error handling

Step 1: Keep the success path and error path separate.

(quoted diff) +1 -1
-       status = _SUCCESS;
+       return padapter;

Step 2: Eliminate do-nothing-gotos. s/goto exit/return NULL/

Step 3: Delete the vfree(pnpi->priv); from rtw_free_netdev() and call
vfree(pnpi->priv); from probe and rtw_usb_if1_deinit() instead. Avoid a layering violation.

Step 4: Every allocation function needs a matching free function. Move
the rtw_cancel_all_timer() into the rtw_free_drv_sw() function. Open coding it is a layering violation.

Step 5: Get rid of the rtw_handle_dualmac() function. It has a bad
name and a global variable. What is the point of this function?

But that stuff is for later patches.

regards,
dan carpenter

Signature · 2 lines
Thanks,
Vihas