@@ -72,8 +72,9 @@ static struct sock *__l2tp_ip6_bind_lookup(struct net *net,
72
72
73
73
if ((l2tp -> conn_id == tunnel_id ) &&
74
74
net_eq (sock_net (sk ), net ) &&
75
- !(addr && ipv6_addr_equal (addr , laddr )) &&
76
- !(sk -> sk_bound_dev_if && sk -> sk_bound_dev_if != dif ))
75
+ (!addr || ipv6_addr_equal (addr , laddr )) &&
76
+ (!sk -> sk_bound_dev_if || !dif ||
77
+ sk -> sk_bound_dev_if == dif ))
77
78
goto found ;
78
79
}
79
80
@@ -196,16 +197,17 @@ static int l2tp_ip6_recv(struct sk_buff *skb)
196
197
struct ipv6hdr * iph = ipv6_hdr (skb );
197
198
198
199
read_lock_bh (& l2tp_ip6_lock );
199
- sk = __l2tp_ip6_bind_lookup (net , & iph -> daddr ,
200
- 0 , tunnel_id );
200
+ sk = __l2tp_ip6_bind_lookup (net , & iph -> daddr , inet6_iif (skb ),
201
+ tunnel_id );
202
+ if (!sk ) {
203
+ read_unlock_bh (& l2tp_ip6_lock );
204
+ goto discard ;
205
+ }
206
+
207
+ sock_hold (sk );
201
208
read_unlock_bh (& l2tp_ip6_lock );
202
209
}
203
210
204
- if (sk == NULL )
205
- goto discard ;
206
-
207
- sock_hold (sk );
208
-
209
211
if (!xfrm6_policy_check (sk , XFRM_POLICY_IN , skb ))
210
212
goto discard_put ;
211
213
@@ -266,6 +268,7 @@ static int l2tp_ip6_bind(struct sock *sk, struct sockaddr *uaddr, int addr_len)
266
268
struct sockaddr_l2tpip6 * addr = (struct sockaddr_l2tpip6 * ) uaddr ;
267
269
struct net * net = sock_net (sk );
268
270
__be32 v4addr = 0 ;
271
+ int bound_dev_if ;
269
272
int addr_type ;
270
273
int err ;
271
274
@@ -284,13 +287,6 @@ static int l2tp_ip6_bind(struct sock *sk, struct sockaddr *uaddr, int addr_len)
284
287
if (addr_type & IPV6_ADDR_MULTICAST )
285
288
return - EADDRNOTAVAIL ;
286
289
287
- err = - EADDRINUSE ;
288
- read_lock_bh (& l2tp_ip6_lock );
289
- if (__l2tp_ip6_bind_lookup (net , & addr -> l2tp_addr ,
290
- sk -> sk_bound_dev_if , addr -> l2tp_conn_id ))
291
- goto out_in_use ;
292
- read_unlock_bh (& l2tp_ip6_lock );
293
-
294
290
lock_sock (sk );
295
291
296
292
err = - EINVAL ;
@@ -300,28 +296,25 @@ static int l2tp_ip6_bind(struct sock *sk, struct sockaddr *uaddr, int addr_len)
300
296
if (sk -> sk_state != TCP_CLOSE )
301
297
goto out_unlock ;
302
298
299
+ bound_dev_if = sk -> sk_bound_dev_if ;
300
+
303
301
/* Check if the address belongs to the host. */
304
302
rcu_read_lock ();
305
303
if (addr_type != IPV6_ADDR_ANY ) {
306
304
struct net_device * dev = NULL ;
307
305
308
306
if (addr_type & IPV6_ADDR_LINKLOCAL ) {
309
- if (addr_len >= sizeof (struct sockaddr_in6 ) &&
310
- addr -> l2tp_scope_id ) {
311
- /* Override any existing binding, if another
312
- * one is supplied by user.
313
- */
314
- sk -> sk_bound_dev_if = addr -> l2tp_scope_id ;
315
- }
307
+ if (addr -> l2tp_scope_id )
308
+ bound_dev_if = addr -> l2tp_scope_id ;
316
309
317
310
/* Binding to link-local address requires an
318
- interface */
319
- if (!sk -> sk_bound_dev_if )
311
+ * interface.
312
+ */
313
+ if (!bound_dev_if )
320
314
goto out_unlock_rcu ;
321
315
322
316
err = - ENODEV ;
323
- dev = dev_get_by_index_rcu (sock_net (sk ),
324
- sk -> sk_bound_dev_if );
317
+ dev = dev_get_by_index_rcu (sock_net (sk ), bound_dev_if );
325
318
if (!dev )
326
319
goto out_unlock_rcu ;
327
320
}
@@ -336,13 +329,22 @@ static int l2tp_ip6_bind(struct sock *sk, struct sockaddr *uaddr, int addr_len)
336
329
}
337
330
rcu_read_unlock ();
338
331
339
- inet -> inet_rcv_saddr = inet -> inet_saddr = v4addr ;
332
+ write_lock_bh (& l2tp_ip6_lock );
333
+ if (__l2tp_ip6_bind_lookup (net , & addr -> l2tp_addr , bound_dev_if ,
334
+ addr -> l2tp_conn_id )) {
335
+ write_unlock_bh (& l2tp_ip6_lock );
336
+ err = - EADDRINUSE ;
337
+ goto out_unlock ;
338
+ }
339
+
340
+ inet -> inet_saddr = v4addr ;
341
+ inet -> inet_rcv_saddr = v4addr ;
342
+ sk -> sk_bound_dev_if = bound_dev_if ;
340
343
sk -> sk_v6_rcv_saddr = addr -> l2tp_addr ;
341
344
np -> saddr = addr -> l2tp_addr ;
342
345
343
346
l2tp_ip6_sk (sk )-> conn_id = addr -> l2tp_conn_id ;
344
347
345
- write_lock_bh (& l2tp_ip6_lock );
346
348
sk_add_bind_node (sk , & l2tp_ip6_bind_table );
347
349
sk_del_node_init (sk );
348
350
write_unlock_bh (& l2tp_ip6_lock );
@@ -355,10 +357,7 @@ static int l2tp_ip6_bind(struct sock *sk, struct sockaddr *uaddr, int addr_len)
355
357
rcu_read_unlock ();
356
358
out_unlock :
357
359
release_sock (sk );
358
- return err ;
359
360
360
- out_in_use :
361
- read_unlock_bh (& l2tp_ip6_lock );
362
361
return err ;
363
362
}
364
363
@@ -371,9 +370,6 @@ static int l2tp_ip6_connect(struct sock *sk, struct sockaddr *uaddr,
371
370
int addr_type ;
372
371
int rc ;
373
372
374
- if (sock_flag (sk , SOCK_ZAPPED )) /* Must bind first - autobinding does not work */
375
- return - EINVAL ;
376
-
377
373
if (addr_len < sizeof (* lsa ))
378
374
return - EINVAL ;
379
375
@@ -390,17 +386,26 @@ static int l2tp_ip6_connect(struct sock *sk, struct sockaddr *uaddr,
390
386
return - EINVAL ;
391
387
}
392
388
393
- rc = ip6_datagram_connect (sk , uaddr , addr_len );
394
-
395
389
lock_sock (sk );
396
390
391
+ /* Must bind first - autobinding does not work */
392
+ if (sock_flag (sk , SOCK_ZAPPED )) {
393
+ rc = - EINVAL ;
394
+ goto out_sk ;
395
+ }
396
+
397
+ rc = __ip6_datagram_connect (sk , uaddr , addr_len );
398
+ if (rc < 0 )
399
+ goto out_sk ;
400
+
397
401
l2tp_ip6_sk (sk )-> peer_conn_id = lsa -> l2tp_conn_id ;
398
402
399
403
write_lock_bh (& l2tp_ip6_lock );
400
404
hlist_del_init (& sk -> sk_bind_node );
401
405
sk_add_bind_node (sk , & l2tp_ip6_bind_table );
402
406
write_unlock_bh (& l2tp_ip6_lock );
403
407
408
+ out_sk :
404
409
release_sock (sk );
405
410
406
411
return rc ;
0 commit comments