Re: [bug report] block: bio-integrity: directly map user buffers

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Tue, Dec 05, 2023 at 09:29:39AM -0700, Keith Busch wrote:
> On Tue, Dec 05, 2023 at 12:35:30PM +0300, Dan Carpenter wrote:
> > Hello Keith Busch,
> > 
> > The patch 492c5d455969: "block: bio-integrity: directly map user
> > buffers" from Nov 30, 2023 (linux-next), leads to the following
> > Smatch static checker warning:
> > 
> > 	block/bio-integrity.c:350 bio_integrity_map_user()
> > 	error: uninitialized symbol 'offset'.
> > 
> > block/bio-integrity.c
> >     340                 if (!bvec)
> >     341                         return -ENOMEM;
> >     342                 pages = NULL;
> >     343         }
> >     344 
> >     345         copy = !iov_iter_is_aligned(&iter, align, align);
> >     346         ret = iov_iter_extract_pages(&iter, &pages, bytes, nr_vecs, 0, &offset);
> > 
> > Smatch is concerned about the first "return 0;" if bytes or iter.count
> > is zero.  In that situation then offset is uninitialized.
> >
> >     347         if (unlikely(ret < 0))
> >     348                 goto free_bvec;
> >     349 
> > --> 350         nr_bvecs = bvec_from_pages(bvec, pages, nr_vecs, bytes, offset);
> >                                                                         ^^^^^^
> 
> Thanks for the report! I don't think there's any scenario where someone
> would purposefully request a 0 length metadata mapping, so I'll have it
> return EINVAL for that condition.
> 
> But ... bvec_from_pages() only reads 'offset' if nr_vecs > 0. nr_vecs
> would have to be 0 in this case, so it's not really accessing an
> uninitialized variable. Everything in fact appears to "work" if you do
> request 0 length, though again, I don't think there's a legit reason to
> ever do that.

When we pass an uninitialized variable to a function but it isn't used,
then we have to look at if the function is inlined or not.  If it's not
inlined then it's still a bug, but if it is inlined, then it's okay.

Passing an uninitialized variable is undefined behavior in C.  And if
someone is running KMemsan then it will trigger a runtime warning.

In this case, I think it's likely that the function will be inlined so
it's probably fine.

regards,
dan carpenter




[Index of Archives]     [Linux RAID]     [Linux SCSI]     [Linux ATA RAID]     [IDE]     [Linux Wireless]     [Linux Kernel]     [ATH6KL]     [Linux Bluetooth]     [Linux Netdev]     [Kernel Newbies]     [Security]     [Git]     [Netfilter]     [Bugtraq]     [Yosemite News]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Device Mapper]

  Powered by Linux