|
@@ -843,6 +843,7 @@ static int do_ip_setsockopt(struct sock *sk, int level,
|
|
{
|
|
{
|
|
struct ip_mreqn mreq;
|
|
struct ip_mreqn mreq;
|
|
struct net_device *dev = NULL;
|
|
struct net_device *dev = NULL;
|
|
|
|
+ int midx;
|
|
|
|
|
|
if (sk->sk_type == SOCK_STREAM)
|
|
if (sk->sk_type == SOCK_STREAM)
|
|
goto e_inval;
|
|
goto e_inval;
|
|
@@ -887,11 +888,15 @@ static int do_ip_setsockopt(struct sock *sk, int level,
|
|
err = -EADDRNOTAVAIL;
|
|
err = -EADDRNOTAVAIL;
|
|
if (!dev)
|
|
if (!dev)
|
|
break;
|
|
break;
|
|
|
|
+
|
|
|
|
+ midx = l3mdev_master_ifindex(dev);
|
|
|
|
+
|
|
dev_put(dev);
|
|
dev_put(dev);
|
|
|
|
|
|
err = -EINVAL;
|
|
err = -EINVAL;
|
|
if (sk->sk_bound_dev_if &&
|
|
if (sk->sk_bound_dev_if &&
|
|
- mreq.imr_ifindex != sk->sk_bound_dev_if)
|
|
|
|
|
|
+ mreq.imr_ifindex != sk->sk_bound_dev_if &&
|
|
|
|
+ (!midx || midx != sk->sk_bound_dev_if))
|
|
break;
|
|
break;
|
|
|
|
|
|
inet->mc_index = mreq.imr_ifindex;
|
|
inet->mc_index = mreq.imr_ifindex;
|