Re: [PATCH] libmultipath: fix ontap prioritizer snprintf limits

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

 



On Tue, Aug 06, 2024 at 09:12:21PM +0200, Martin Wilck wrote:
> On Fri, 2024-08-02 at 13:26 -0400, Benjamin Marzinski wrote:
> > The ontap prioritizer functions dump_cdb() and process_sg_error()
> > both
> > incorrectly set the snprintf() limits larger than the available
> > space.
> > Instead of multiplying the number of elements to print by the size of
> > an
> > element to calculate the limit, they multiplied the number of
> > elements
> > to print by the maximum number of elements that the buffer could
> > hold.
> > 
> > Fix this, and also make sure that the number of elements to print is
> > less than or equal to the maximum number that the buffer can hold.
> > 
> > Signed-off-by: Benjamin Marzinski <bmarzins@xxxxxxxxxx>
> > ---
> >  libmultipath/prioritizers/ontap.c | 8 ++++----
> >  1 file changed, 4 insertions(+), 4 deletions(-)
> > 
> > diff --git a/libmultipath/prioritizers/ontap.c
> > b/libmultipath/prioritizers/ontap.c
> > index 117886ea..28e663ac 100644
> > --- a/libmultipath/prioritizers/ontap.c
> > +++ b/libmultipath/prioritizers/ontap.c
> > @@ -39,8 +39,8 @@ static void dump_cdb(unsigned char *cdb, int size)
> >  	char * p = &buf[0];
> >  
> >  	condlog(0, "- SCSI CDB: ");
> > -	for (i=0; i<size; i++) {
> > -		p += snprintf(p, 10*(size-i), "0x%02x ", cdb[i]);
> > +	for (i = 0; i < size && i < 10; i++) {
> > +		p += snprintf(p, 5*(size-i), "0x%02x ", cdb[i]);
> >  	}
> 
> This seems incorrect, too. We should pass the remaining size of the
> buffer, which is ((10 - i) * 5 + 1), unless I am mistaken. It's bogus
> to use the "size" variable in the calculation of the remaining buffer
> size. Plus, we should break the loop if i >= 10, and check the return
> value of snprintf (if we don't, we might as well use sprintf in the
> first place).
> 
> Actually, this code is horrible and we should rather use strbuf.
> Strange that none of our many compilers found this, and even coverity
> didn't.
> 
> >  	condlog(0, "%s", buf);
> >  }
> > @@ -56,8 +56,8 @@ static void process_sg_error(struct sg_io_hdr
> > *io_hdr)
> >  		io_hdr->host_status, io_hdr->driver_status);
> >  	if (io_hdr->sb_len_wr > 0) {
> >  		condlog(0, "- SCSI sense data: ");
> > -		for (i=0; i<io_hdr->sb_len_wr; i++) {
> > -			p += snprintf(p, 128*(io_hdr->sb_len_wr-i),
> > "0x%02x ",
> > +		for (i = 0; i < io_hdr->sb_len_wr && i < 128; i++) {
> > +			p += snprintf(p, 5*(io_hdr->sb_len_wr-i),
> > "0x%02x ",
> >  				      io_hdr->sbp[i]);
> >  		}
> 
> Same here, the remaining buffer size is (5 * (128 - i) + 1).

Sure. I'll send a v2.

-Ben
 
> Martin
> 
> >  		condlog(0, "%s", buf);





[Index of Archives]     [DM Crypt]     [Fedora Desktop]     [ATA RAID]     [Fedora Marketing]     [Fedora Packaging]     [Fedora SELinux]     [Yosemite Discussion]     [KDE Users]     [Fedora Docs]

  Powered by Linux