File tree 1 file changed +15
-2
lines changed 1 file changed +15
-2
lines changed Original file line number Diff line number Diff line change @@ -285,26 +285,37 @@ static int gtp1u_udp_encap_recv(struct gtp_dev *gtp, struct sk_buff *skb)
285
285
return gtp_rx (pctx , skb , hdrlen , gtp -> role );
286
286
}
287
287
288
- static void gtp_encap_destroy (struct sock * sk )
288
+ static void __gtp_encap_destroy (struct sock * sk )
289
289
{
290
290
struct gtp_dev * gtp ;
291
291
292
292
lock_sock (sk );
293
293
gtp = sk -> sk_user_data ;
294
294
if (gtp ) {
295
+ if (gtp -> sk0 == sk )
296
+ gtp -> sk0 = NULL ;
297
+ else
298
+ gtp -> sk1u = NULL ;
295
299
udp_sk (sk )-> encap_type = 0 ;
296
300
rcu_assign_sk_user_data (sk , NULL );
297
301
sock_put (sk );
298
302
}
299
303
release_sock (sk );
300
304
}
301
305
306
+ static void gtp_encap_destroy (struct sock * sk )
307
+ {
308
+ rtnl_lock ();
309
+ __gtp_encap_destroy (sk );
310
+ rtnl_unlock ();
311
+ }
312
+
302
313
static void gtp_encap_disable_sock (struct sock * sk )
303
314
{
304
315
if (!sk )
305
316
return ;
306
317
307
- gtp_encap_destroy (sk );
318
+ __gtp_encap_destroy (sk );
308
319
}
309
320
310
321
static void gtp_encap_disable (struct gtp_dev * gtp )
@@ -1043,6 +1054,7 @@ static int gtp_genl_new_pdp(struct sk_buff *skb, struct genl_info *info)
1043
1054
return - EINVAL ;
1044
1055
}
1045
1056
1057
+ rtnl_lock ();
1046
1058
rcu_read_lock ();
1047
1059
1048
1060
gtp = gtp_find_dev (sock_net (skb -> sk ), info -> attrs );
@@ -1067,6 +1079,7 @@ static int gtp_genl_new_pdp(struct sk_buff *skb, struct genl_info *info)
1067
1079
1068
1080
out_unlock :
1069
1081
rcu_read_unlock ();
1082
+ rtnl_unlock ();
1070
1083
return err ;
1071
1084
}
1072
1085
You can’t perform that action at this time.
0 commit comments