w1: fix data abort if no one wire bus master present
authorMartin Fuzzey <martin.fuzzey@flowbird.group>
Mon, 22 Oct 2018 16:31:08 +0000 (18:31 +0200)
committerTom Rini <trini@konsulko.com>
Thu, 1 Nov 2018 14:02:10 +0000 (10:02 -0400)
When the "w1 bus" command is used with no bus master present
a data abort may occur.

This is because uclass_first_device() returns zero, but sets the output
struct udevice pointer to NULL in the no device found case.

Fix w1_get_bus() to account for this and return an error code
as is expected by the callers.

Signed-off-by: Martin Fuzzey <martin.fuzzey@flowbird.group>
Reviewed-by: Eugen Hristev <eugen.hristev@microchip.com>
drivers/w1/w1-uclass.c

index aecf7fec77cf7bcc90e4d7f34fb4cbe919f9c16f..cb41b68eff1a4de7dee2b9b37e39fbac934d0109 100644 (file)
@@ -115,17 +115,19 @@ int w1_get_bus(int busnum, struct udevice **busp)
        struct udevice *dev;
 
        for (ret = uclass_first_device(UCLASS_W1, &dev);
-            !ret;
-            uclass_next_device(&dev), i++) {
-               if (ret) {
-                       debug("Cannot find w1 bus %d\n", busnum);
-                       return ret;
-               }
+            dev && !ret;
+            ret = uclass_next_device(&dev), i++) {
                if (i == busnum) {
                        *busp = dev;
                        return 0;
                }
        }
+
+       if (!ret) {
+               debug("Cannot find w1 bus %d\n", busnum);
+               ret = -ENODEV;
+       }
+
        return ret;
 }