Skip to content

Commit 914c645

Browse files
ARC-CPSgregkh
authored andcommitted
net: caif: clear client service pointer on teardown
commit f7cf8ec upstream. `caif_connect()` can tear down an existing client after remote shutdown by calling `caif_disconnect_client()` followed by `caif_free_client()`. `caif_free_client()` releases the service layer referenced by `adap_layer->dn`, but leaves that pointer stale. When the socket is later destroyed, `caif_sock_destructor()` calls `caif_free_client()` again and dereferences the freed service pointer. Clear the client/service links before releasing the service object so repeated teardown becomes harmless. Fixes: 43e3692 ("caif: Move refcount from service layer to sock and dev.") Cc: stable@kernel.org Reported-by: Yifan Wu <yifanwucs@gmail.com> Reported-by: Juefei Pu <tomapufckgml@gmail.com> Co-developed-by: Yuan Tan <yuantan098@gmail.com> Signed-off-by: Yuan Tan <yuantan098@gmail.com> Suggested-by: Xin Liu <bird@lzu.edu.cn> Tested-by: Ren Wei <enjou1224z@gmail.com> Signed-off-by: Zhengchuan Liang <zcliangcn@gmail.com> Signed-off-by: Ren Wei <n05ec@lzu.edu.cn> Link: https://patch.msgid.link/9f3d37847c0037568aae698ca23cd47c6691acb0.1775897577.git.zcliangcn@gmail.com Signed-off-by: Paolo Abeni <pabeni@redhat.com> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
1 parent 1fbe46d commit 914c645

1 file changed

Lines changed: 12 additions & 2 deletions

File tree

net/caif/cfsrvl.c

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -197,10 +197,20 @@ bool cfsrvl_phyid_match(struct cflayer *layer, int phyid)
197197

198198
void caif_free_client(struct cflayer *adap_layer)
199199
{
200+
struct cflayer *serv_layer;
200201
struct cfsrvl *servl;
201-
if (adap_layer == NULL || adap_layer->dn == NULL)
202+
203+
if (!adap_layer)
204+
return;
205+
206+
serv_layer = adap_layer->dn;
207+
if (!serv_layer)
202208
return;
203-
servl = container_obj(adap_layer->dn);
209+
210+
layer_set_dn(adap_layer, NULL);
211+
layer_set_up(serv_layer, NULL);
212+
213+
servl = container_obj(serv_layer);
204214
servl->release(&servl->layer);
205215
}
206216
EXPORT_SYMBOL(caif_free_client);

0 commit comments

Comments
 (0)