|
@@ -673,10 +673,15 @@ static int do_ip_setsockopt(struct sock *sk, int level,
|
|
|
break;
|
|
|
} else {
|
|
|
memset(&mreq, 0, sizeof(mreq));
|
|
|
- if (optlen >= sizeof(struct in_addr) &&
|
|
|
- copy_from_user(&mreq.imr_address, optval,
|
|
|
- sizeof(struct in_addr)))
|
|
|
- break;
|
|
|
+ if (optlen >= sizeof(struct ip_mreq)) {
|
|
|
+ if (copy_from_user(&mreq, optval,
|
|
|
+ sizeof(struct ip_mreq)))
|
|
|
+ break;
|
|
|
+ } else if (optlen >= sizeof(struct in_addr)) {
|
|
|
+ if (copy_from_user(&mreq.imr_address, optval,
|
|
|
+ sizeof(struct in_addr)))
|
|
|
+ break;
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
if (!mreq.imr_ifindex) {
|