]> git.dujemihanovic.xyz Git - u-boot.git/commitdiff
phy: Set phy->dev to NULL when generic_phy_get_by_name() fails
authorJonas Karlman <jonas@kwiboo.se>
Thu, 31 Aug 2023 22:16:33 +0000 (22:16 +0000)
committerTom Rini <trini@konsulko.com>
Wed, 13 Sep 2023 19:52:20 +0000 (15:52 -0400)
generic_phy_get_by_name() does not initialize phy->dev to NULL before
returning when dev_read_stringlist_search() fails. This can lead to an
uninitialized or reused struct phy erroneously be report as valid by
generic_phy_valid().

Fix this issue by initializing phy->dev to NULL, also extend the
dm_test_phy_base test with calls to generic_phy_valid().

Fixes: b9688df3cbf4 ("drivers: phy: Set phy->dev to NULL when generic_phy_get_by_index() fails")
Fixes: 868d58f69c7c ("usb: dwc3: Fix non-usb3 configurations")
Signed-off-by: Jonas Karlman <jonas@kwiboo.se>
drivers/phy/phy-uclass.c
test/dm/phy.c

index 629ef3aa3de57fda8fcfda818fe059c728e34577..0baf314a34715bb8163e2c2eb75915f0f68c4ba1 100644 (file)
@@ -211,6 +211,9 @@ int generic_phy_get_by_name(struct udevice *dev, const char *phy_name,
 
        debug("%s(dev=%p, name=%s, phy=%p)\n", __func__, dev, phy_name, phy);
 
+       assert(phy);
+       phy->dev = NULL;
+
        index = dev_read_stringlist_search(dev, "phy-names", phy_name);
        if (index < 0) {
                debug("dev_read_stringlist_search() failed: %d\n", index);
index 4d4a083dd0fde5bd7102ae81cc8ace83b573fc83..09329b9f71f601e9259b16d5ca42bbf369cb79c0 100644 (file)
@@ -29,7 +29,9 @@ static int dm_test_phy_base(struct unit_test_state *uts)
         * Get the same phy port in 2 different ways and compare.
         */
        ut_assertok(generic_phy_get_by_name(parent, "phy1", &phy1_method1));
+       ut_assert(generic_phy_valid(&phy1_method1));
        ut_assertok(generic_phy_get_by_index(parent, 0, &phy1_method2));
+       ut_assert(generic_phy_valid(&phy1_method2));
        ut_asserteq(phy1_method1.id, phy1_method2.id);
 
        /*
@@ -50,6 +52,10 @@ static int dm_test_phy_base(struct unit_test_state *uts)
        ut_asserteq(-ENODEV, uclass_get_device(UCLASS_PHY, 4, &dev));
        ut_asserteq(-ENODATA, generic_phy_get_by_name(parent,
                                        "phy_not_existing", &phy1_method1));
+       ut_assert(!generic_phy_valid(&phy1_method1));
+       ut_asserteq(-ENOENT, generic_phy_get_by_index(parent, 3,
+                                                     &phy1_method2));
+       ut_assert(!generic_phy_valid(&phy1_method2));
 
        return 0;
 }