|
|
@@ -52,6 +52,8 @@
|
|
|
#include <net/ip6_checksum.h>
|
|
|
#include <linux/netconf.h>
|
|
|
|
|
|
+#include <linux/nospec.h>
|
|
|
+
|
|
|
struct ip6mr_rule {
|
|
|
struct fib_rule common;
|
|
|
};
|
|
|
@@ -1831,6 +1833,7 @@ int ip6mr_ioctl(struct sock *sk, int cmd, void __user *arg)
|
|
|
return -EFAULT;
|
|
|
if (vr.mifi >= mrt->maxvif)
|
|
|
return -EINVAL;
|
|
|
+ vr.mifi = array_index_nospec(vr.mifi, mrt->maxvif);
|
|
|
read_lock(&mrt_lock);
|
|
|
vif = &mrt->vif_table[vr.mifi];
|
|
|
if (VIF_EXISTS(mrt, vr.mifi)) {
|
|
|
@@ -1905,6 +1908,7 @@ int ip6mr_compat_ioctl(struct sock *sk, unsigned int cmd, void __user *arg)
|
|
|
return -EFAULT;
|
|
|
if (vr.mifi >= mrt->maxvif)
|
|
|
return -EINVAL;
|
|
|
+ vr.mifi = array_index_nospec(vr.mifi, mrt->maxvif);
|
|
|
read_lock(&mrt_lock);
|
|
|
vif = &mrt->vif_table[vr.mifi];
|
|
|
if (VIF_EXISTS(mrt, vr.mifi)) {
|