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 @@ -289,26 +289,37 @@ static int gtp1u_udp_encap_recv(struct gtp_dev *gtp, struct sk_buff *skb)
289
289
return gtp_rx (pctx , skb , hdrlen , gtp -> role );
290
290
}
291
291
292
- static void gtp_encap_destroy (struct sock * sk )
292
+ static void __gtp_encap_destroy (struct sock * sk )
293
293
{
294
294
struct gtp_dev * gtp ;
295
295
296
296
lock_sock (sk );
297
297
gtp = sk -> sk_user_data ;
298
298
if (gtp ) {
299
+ if (gtp -> sk0 == sk )
300
+ gtp -> sk0 = NULL ;
301
+ else
302
+ gtp -> sk1u = NULL ;
299
303
udp_sk (sk )-> encap_type = 0 ;
300
304
rcu_assign_sk_user_data (sk , NULL );
301
305
sock_put (sk );
302
306
}
303
307
release_sock (sk );
304
308
}
305
309
310
+ static void gtp_encap_destroy (struct sock * sk )
311
+ {
312
+ rtnl_lock ();
313
+ __gtp_encap_destroy (sk );
314
+ rtnl_unlock ();
315
+ }
316
+
306
317
static void gtp_encap_disable_sock (struct sock * sk )
307
318
{
308
319
if (!sk )
309
320
return ;
310
321
311
- gtp_encap_destroy (sk );
322
+ __gtp_encap_destroy (sk );
312
323
}
313
324
314
325
static void gtp_encap_disable (struct gtp_dev * gtp )
@@ -1047,6 +1058,7 @@ static int gtp_genl_new_pdp(struct sk_buff *skb, struct genl_info *info)
1047
1058
return - EINVAL ;
1048
1059
}
1049
1060
1061
+ rtnl_lock ();
1050
1062
rcu_read_lock ();
1051
1063
1052
1064
gtp = gtp_find_dev (sock_net (skb -> sk ), info -> attrs );
@@ -1071,6 +1083,7 @@ static int gtp_genl_new_pdp(struct sk_buff *skb, struct genl_info *info)
1071
1083
1072
1084
out_unlock :
1073
1085
rcu_read_unlock ();
1086
+ rtnl_unlock ();
1074
1087
return err ;
1075
1088
}
1076
1089
You can’t perform that action at this time.
0 commit comments