component: fix loop condition to call unbind() if bind() fails
authorBanajit Goswami <bgoswami@codeaurora.org>
Tue, 28 Aug 2018 04:15:39 +0000 (21:15 -0700)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Mon, 25 Nov 2019 08:52:23 +0000 (09:52 +0100)
[ Upstream commit bdae566d5d9733b6e32b378668b84eadf28a94d4 ]

During component_bind_all(), if bind() fails for any
particular component associated with a master, unbind()
should be called for all previous components in that
master's match array, whose bind() might have completed
successfully. As per the current logic, if bind() fails
for the component at position 'n' in the master's match
array, it would start calling unbind() from component in
'n'th position itself and work backwards, and will always
skip calling unbind() for component in 0th position in the
master's match array.
Fix this by updating the loop condition, and the logic to
refer to the components in master's match array, so that
unbind() is called for all components starting from 'n-1'st
position in the array, until (and including) component in
0th position.

Signed-off-by: Banajit Goswami <bgoswami@codeaurora.org>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Signed-off-by: Sasha Levin <sashal@kernel.org>
drivers/base/component.c

index 89b032f2ffd222ed65ec771634fe1e694b916bbb..08da6160e94dd3521236dfdf567ac5a1ba61edc3 100644 (file)
@@ -461,9 +461,9 @@ int component_bind_all(struct device *master_dev, void *data)
                }
 
        if (ret != 0) {
-               for (; i--; )
-                       if (!master->match->compare[i].duplicate) {
-                               c = master->match->compare[i].component;
+               for (; i > 0; i--)
+                       if (!master->match->compare[i - 1].duplicate) {
+                               c = master->match->compare[i - 1].component;
                                component_unbind(c, master, data);
                        }
        }