]> git.dujemihanovic.xyz Git - u-boot.git/commitdiff
dfu: dfu_sf: avoid double free of SPI device
authorHeinrich Schuchardt <xypron.glpk@gmx.de>
Thu, 18 Mar 2021 06:46:07 +0000 (07:46 +0100)
committerHeinrich Schuchardt <xypron.glpk@gmx.de>
Thu, 25 Mar 2021 19:15:30 +0000 (20:15 +0100)
Multiple DFU entities may share the same SPI device. We must make sure that
the SPI device is only freed once.

When using the driver model it is not necessary to free the SPI device.

Signed-off-by: Heinrich Schuchardt <xypron.glpk@gmx.de>
Acked-by: Lukasz Majewski <lukma@denx.de>
drivers/dfu/dfu_sf.c

index 76b629a334f50faecdda810f81f97dc2ce30c7f7..8f8c4259772139094f6a2eb0d1e031446a8c4b53 100644 (file)
@@ -87,7 +87,23 @@ static unsigned int dfu_polltimeout_sf(struct dfu_entity *dfu)
 
 static void dfu_free_entity_sf(struct dfu_entity *dfu)
 {
-       spi_flash_free(dfu->data.sf.dev);
+       /*
+        * In the DM case it is not necessary to free the SPI device.
+        * For the non-DM case we must ensure that the the SPI device is only
+        * freed once.
+        */
+       if (!CONFIG_IS_ENABLED(DM_SPI_FLASH)) {
+               struct spi_flash *dev = dfu->data.sf.dev;
+
+               if (!dev)
+                       return;
+               dfu->data.sf.dev = NULL;
+               list_for_each_entry(dfu, &dfu_list, list) {
+                       if (dfu->data.sf.dev == dev)
+                               dfu->data.sf.dev = NULL;
+               }
+               spi_flash_free(dev);
+       }
 }
 
 static struct spi_flash *parse_dev(char *devstr)