diff mbox series

[V1] netifd: fix wdev->data lifetime

Message ID 20200623094028.1248246-1-john@phrozen.org
State Changes Requested
Delegated to: John Crispin
Headers show
Series [V1] netifd: fix wdev->data lifetime | expand

Commit Message

John Crispin June 23, 2020, 9:40 a.m. UTC
The reconf patch breaks wifi down under certain conditions. The root cause
is that during reload the wdev state gets flushed. This has the effect, that
the phy is lost from the state resulting in teardown breaking.
Fix this by changing the lifetime of wdev->data.

Signed-off-by: John Crispin <john@phrozen.org>
---
Changes in V2
* free() call was in the wrong place

 wireless.c | 5 +++--
 1 file changed, 3 insertions(+), 2 deletions(-)

Comments

John Crispin June 23, 2020, 7:48 p.m. UTC | #1
On 23.06.20 11:40, John Crispin wrote:
> The reconf patch breaks wifi down under certain conditions. The root cause
> is that during reload the wdev state gets flushed. This has the effect, that
> the phy is lost from the state resulting in teardown breaking.
> Fix this by changing the lifetime of wdev->data.
>
> Signed-off-by: John Crispin <john@phrozen.org>
> ---
> Changes in V2
> * free() call was in the wrong place
>
>   wireless.c | 5 +++--
>   1 file changed, 3 insertions(+), 2 deletions(-)
>
> diff --git a/wireless.c b/wireless.c
> index efb7992..e295f28 100644
> --- a/wireless.c
> +++ b/wireless.c
> @@ -275,8 +275,6 @@ wireless_device_free_state(struct wireless_device *wdev)
>   	uloop_timeout_cancel(&wdev->script_check);
>   	uloop_timeout_cancel(&wdev->timeout);
>   	wireless_complete_kill_request(wdev);
> -	free(wdev->data);
> -	wdev->data = NULL;
>   	vlist_for_each_element(&wdev->interfaces, vif, node) {
>   		free(vif->data);
>   		vif->data = NULL;
> @@ -460,6 +458,7 @@ wireless_device_free(struct wireless_device *wdev)
>   	vlist_flush_all(&wdev->vlans);
>   	vlist_flush_all(&wdev->stations);
>   	avl_delete(&wireless_devices.avl, &wdev->node.avl);
> +	free(wdev->data);
>   	free(wdev->config);
>   	free(wdev->prev_config);
>   	free(wdev);
> @@ -1414,6 +1413,8 @@ wireless_device_notify(struct wireless_device *wdev, struct blob_attr *data,
>   		if (*pdata)
>   			return UBUS_STATUS_INVALID_ARGUMENT;
>   
> +		if (*pdata)
> +			free(*pdata);
>   		*pdata = blob_memdup(cur);
>   		if (vif)
>   			wireless_interface_set_data(vif);
>      

thx, looks like the  rest of the patch fixes the issue, been stress testing this today, will have a closer look tomorrow ..

John
diff mbox series

Patch

diff --git a/wireless.c b/wireless.c
index efb7992..e295f28 100644
--- a/wireless.c
+++ b/wireless.c
@@ -275,8 +275,6 @@  wireless_device_free_state(struct wireless_device *wdev)
 	uloop_timeout_cancel(&wdev->script_check);
 	uloop_timeout_cancel(&wdev->timeout);
 	wireless_complete_kill_request(wdev);
-	free(wdev->data);
-	wdev->data = NULL;
 	vlist_for_each_element(&wdev->interfaces, vif, node) {
 		free(vif->data);
 		vif->data = NULL;
@@ -460,6 +458,7 @@  wireless_device_free(struct wireless_device *wdev)
 	vlist_flush_all(&wdev->vlans);
 	vlist_flush_all(&wdev->stations);
 	avl_delete(&wireless_devices.avl, &wdev->node.avl);
+	free(wdev->data);
 	free(wdev->config);
 	free(wdev->prev_config);
 	free(wdev);
@@ -1414,6 +1413,8 @@  wireless_device_notify(struct wireless_device *wdev, struct blob_attr *data,
 		if (*pdata)
 			return UBUS_STATUS_INVALID_ARGUMENT;
 
+		if (*pdata)
+			free(*pdata);
 		*pdata = blob_memdup(cur);
 		if (vif)
 			wireless_interface_set_data(vif);