[bug report] scsi: mpi3mr: Add bsg device support

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

 



Hello Sumit Saxena,

The patch 4268fa751365: "scsi: mpi3mr: Add bsg device support" from
Apr 29, 2022, leads to the following Smatch static checker warning:

	drivers/scsi/mpi3mr/mpi3mr_app.c:1539 mpi3mr_bsg_init()
	warn: double put_device() 'mrioc->bsg_dev->kobj' (see line 1539)

[ This warning is from development versions of Smatch that I have not
  published yet ]

drivers/scsi/mpi3mr/mpi3mr_app.c
  1480  /**
  1481   * mpi3mr_bsg_exit - de-registration from bsg layer
  1482   *
  1483   * This will be called during driver unload and all
  1484   * bsg resources allocated during load will be freed.
  1485   *
  1486   * Return:Nothing
  1487   */
  1488  void mpi3mr_bsg_exit(struct mpi3mr_ioc *mrioc)
  1489  {
  1490          if (!mrioc->bsg_queue)
  1491                  return;
  1492  
  1493          bsg_remove_queue(mrioc->bsg_queue);
  1494          mrioc->bsg_queue = NULL;
  1495  
  1496          device_del(mrioc->bsg_dev);
  1497          put_device(mrioc->bsg_dev);
  1498          kfree(mrioc->bsg_dev);
  1499  }

I'm pretty sure this code is buggy.  The put_device() has a config
option which adds a delay to calling the release() function
CONFIG_DEBUG_KOBJECT_RELEASE.  So if you enable the delay, I think it
will dereference "mrioc->bsg_dev" after it is freed.

[ snip ]

  1501  /**
  1502   * mpi3mr_bsg_node_release -release bsg device node
  1503   * @dev: bsg device node
  1504   *
  1505   * decrements bsg dev reference count
  1506   *
  1507   * Return:Nothing
  1508   */
  1509  static void mpi3mr_bsg_node_release(struct device *dev)
  1510  {
  1511          put_device(dev);
  1512  }


Normally, the device struct would just be embedded into the
mrioc struct.  (Not a pointer).  So this function would normally be
something like:

	struct mpi3mr_ioc *mrioc = container_of(dev, ...);

	kfree(mrioc);

But here it's a separate pointer.  So I guess it should just be:

	kfree(dev);

[ snip ]

    1522 void mpi3mr_bsg_init(struct mpi3mr_ioc *mrioc)
    1523 {
    1524         mrioc->bsg_dev = kzalloc(sizeof(struct device), GFP_KERNEL);
    1525         if (!mrioc->bsg_dev) {
    1526                 ioc_err(mrioc, "bsg device mem allocation failed\n");
    1527                 return;
    1528         }
    1529 
    1530         device_initialize(mrioc->bsg_dev);
                 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
The device model is very tricky and it confuses me too.

After you do a device initialize, the you must free mrioc->bsg_dev
using put_device().  Calling kfree(mrioc->bsg_dev) is a bug.  I'm not
sure all the implications but at a minimum it's a small memory leak.

But we haven't set up a ->release function at this point so that's
another thing.

    1531         dev_set_name(mrioc->bsg_dev, "mpi3mrctl%u", mrioc->id);
    1532 
    1533         if (device_add(mrioc->bsg_dev)) {
    1534                 ioc_err(mrioc, "%s: bsg device add failed\n",
    1535                     dev_name(mrioc->bsg_dev));
    1536                 goto err_device_add;
    1537         }
    1538 
--> 1539         mrioc->bsg_dev->release = mpi3mr_bsg_node_release;
    1540 
    1541         mrioc->bsg_queue = bsg_setup_queue(mrioc->bsg_dev, dev_name(mrioc->bsg_dev),
    1542                         mpi3mr_bsg_request, NULL, 0);
    1543         if (!mrioc->bsg_queue) {
    1544                 ioc_err(mrioc, "%s: bsg registration failed\n",
    1545                     dev_name(mrioc->bsg_dev));
    1546                 goto err_setup_queue;
    1547         }
    1548 
    1549         blk_queue_max_segments(mrioc->bsg_queue, MPI3MR_MAX_APP_XFER_SEGMENTS);
    1550         blk_queue_max_hw_sectors(mrioc->bsg_queue, MPI3MR_MAX_APP_XFER_SECTORS);
    1551 
    1552         return;
    1553 
    1554 err_setup_queue:
    1555         device_del(mrioc->bsg_dev);
    1556         put_device(mrioc->bsg_dev);

Smatch is saying that this put_device() will trigger a call to
mpi3mr_bsg_node_release() which will make the refcount negative.  That
seems like a reasonable warning.

    1557 err_device_add:
    1558         kfree(mrioc->bsg_dev);
    1559 }

regards,
dan carpenter



[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Index of Archives]     [SCSI Target Devel]     [Linux SCSI Target Infrastructure]     [Kernel Newbies]     [IDE]     [Security]     [Git]     [Netfilter]     [Bugtraq]     [Yosemite News]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Linux ATA RAID]     [Linux IIO]     [Samba]     [Device Mapper]

  Powered by Linux