On Fri, 05 Jan 2018 17:11:04 -0800 Dan Williams <dan.j.williams@xxxxxxxxx> wrote: > Static analysis reports that 'offset' may be a user controlled value > that is used as a data dependency reading from a raw6_frag_vec buffer. > In order to avoid potential leaks of kernel memory values, block > speculative execution of the instruction stream that could issue further > reads based on an invalid '*(rfv->c + offset)' value. > > Based on an original patch by Elena Reshetova. > > Cc: "David S. Miller" <davem@xxxxxxxxxxxxx> > Cc: Alexey Kuznetsov <kuznet@xxxxxxxxxxxxx> > Cc: Hideaki YOSHIFUJI <yoshfuji@xxxxxxxxxxxxxx> > Cc: netdev@xxxxxxxxxxxxxxx > Signed-off-by: Elena Reshetova <elena.reshetova@xxxxxxxxx> > Signed-off-by: Dan Williams <dan.j.williams@xxxxxxxxx> > --- > net/ipv6/raw.c | 9 +++++---- > 1 file changed, 5 insertions(+), 4 deletions(-) > > diff --git a/net/ipv6/raw.c b/net/ipv6/raw.c > index 761a473a07c5..384e3d59d148 100644 > --- a/net/ipv6/raw.c > +++ b/net/ipv6/raw.c > @@ -33,6 +33,7 @@ > #include <linux/skbuff.h> > #include <linux/compat.h> > #include <linux/uaccess.h> > +#include <linux/compiler.h> > #include <asm/ioctls.h> > > #include <net/net_namespace.h> > @@ -725,17 +726,17 @@ static int raw6_getfrag(void *from, char *to, int offset, int len, int odd, > struct sk_buff *skb) > { > struct raw6_frag_vec *rfv = from; > + char *rfv_buf; > > - if (offset < rfv->hlen) { > + if ((rfv_buf = nospec_array_ptr(rfv->c, offset, rfv->hlen))) { > int copy = min(rfv->hlen - offset, len); Minor nit. Please don't do assignment in condition test here. Instead. rfv_buf = nospec_array_ptr(rfv->c, offset, rfv->hlen); if (rfv_buf) {