Re: [PATCH 03/24] staging: ks7010: add BUG_ON() to catch programmer error

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

 



On Sun, Apr 02, 2017 at 10:18:09AM +1000, Tobin C. Harding wrote:
> Constant is used to allocate memory for a buffer, then buffer is
> filled upto 'size' which is passed as a parameter. If 'size' is bigger
> than the constant then the buffer will overflow. Function has internal
> linkage so this can only happen due to programmer error. BUG_ON() is
> designed for catching these cases. Currently there is only one call
> site and it is correct, adding BUG_ON() will potentially save
> developer time if later changes to the code are incorrect.
> 
> Use BUG_ON() to guard buffer write size in function with internal linkage.

Nah.  Adding these BUG_ON() calls everywhere is ugly.  There are tons
and tons of assumptions like this in the kernel and we'd have to add
thousands of BUG_ON()s to cover everything.

You say the caller is correct but Smatch thinks it's not very safe.

drivers/staging/ks7010/ks7010_sdio.c
   739                  goto release_host_and_free;
   740  
   741          length = fw_entry->size;

length is an int.  Let's imagine that it's negative.

   742  
   743          /* Load Program */
   744          n = 0;
   745          do {
   746                  if (length >= ROM_BUFF_SIZE) {
                            ^^^^^^^^^^^^^^^^^^^^^^^
length is negative so it's less than ROM_BUFF_SIZE.

   747                          size = ROM_BUFF_SIZE;
   748                          length = length - ROM_BUFF_SIZE;
   749                  } else {
   750                          size = length;

size is u32 so it's now a huge size.

   751                          length = 0;
   752                  }
   753                  DPRINTK(4, "size = %d\n", size);
   754                  if (size == 0)
   755                          break;
   756                  memcpy(rom_buf, fw_entry->data + n, size);
   757                  /* Update write index */
   758                  offset = n;
   759                  ret = ks7010_sdio_update_index(priv, KS7010_IRAM_ADDRESS + offset);
   760                  if (ret)
   761                          goto release_firmware;
   762  
   763                  /* Write data */
   764                  ret = ks7010_sdio_write(priv, DATA_WINDOW, rom_buf, size);
                                                                            ^^^^
We're passing a huge value for size.

Instead of adding a BUG_ON(), let's just make "length" unsigned.

There is a Smatch interface to see all this information but it's a bit
unwieldy.  I've got a couple ideas to maybe improve it later this month
and maybe a few years down the line it would also be nice to integrate
this information with the vim so you could highlight every possibly
unsafe array access.  Right now Smatch tries to give you a very limited
set of warnings for things which are highly risky, but if it were
integrated with the IDE we could be far more picky about every unsafe
thing.

regards,
dan carpenter
_______________________________________________
devel mailing list
devel@xxxxxxxxxxxxxxxxxxxxxx
http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel



[Index of Archives]     [Linux Driver Backports]     [DMA Engine]     [Linux GPIO]     [Linux SPI]     [Video for Linux]     [Linux USB Devel]     [Linux Coverity]     [Linux Audio Users]     [Linux Kernel]     [Linux SCSI]     [Yosemite Backpacking]
  Powered by Linux