Skip to content

Commit 02a4a69

Browse files
Vladimir Zapolskiywsakernel
authored andcommitted
i2c: qcom-cci: don't put a device tree node before i2c_add_adapter()
There is a minor chance for a race, if a pointer to an i2c-bus subnode is stored and then reused after releasing its reference, and it would be sufficient to get one more reference under a loop over children subnodes. Fixes: e517526 ("i2c: Add Qualcomm CCI I2C driver") Signed-off-by: Vladimir Zapolskiy <vladimir.zapolskiy@linaro.org> Reviewed-by: Robert Foss <robert.foss@linaro.org> Reviewed-by: Bjorn Andersson <bjorn.andersson@linaro.org> Signed-off-by: Wolfram Sang <wsa@kernel.org>
1 parent a0d4850 commit 02a4a69

1 file changed

Lines changed: 10 additions & 4 deletions

File tree

drivers/i2c/busses/i2c-qcom-cci.c

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -558,7 +558,7 @@ static int cci_probe(struct platform_device *pdev)
558558
cci->master[idx].adap.quirks = &cci->data->quirks;
559559
cci->master[idx].adap.algo = &cci_algo;
560560
cci->master[idx].adap.dev.parent = dev;
561-
cci->master[idx].adap.dev.of_node = child;
561+
cci->master[idx].adap.dev.of_node = of_node_get(child);
562562
cci->master[idx].master = idx;
563563
cci->master[idx].cci = cci;
564564

@@ -643,8 +643,10 @@ static int cci_probe(struct platform_device *pdev)
643643
continue;
644644

645645
ret = i2c_add_adapter(&cci->master[i].adap);
646-
if (ret < 0)
646+
if (ret < 0) {
647+
of_node_put(cci->master[i].adap.dev.of_node);
647648
goto error_i2c;
649+
}
648650
}
649651

650652
pm_runtime_set_autosuspend_delay(dev, MSEC_PER_SEC);
@@ -656,8 +658,10 @@ static int cci_probe(struct platform_device *pdev)
656658

657659
error_i2c:
658660
for (--i ; i >= 0; i--) {
659-
if (cci->master[i].cci)
661+
if (cci->master[i].cci) {
660662
i2c_del_adapter(&cci->master[i].adap);
663+
of_node_put(cci->master[i].adap.dev.of_node);
664+
}
661665
}
662666
error:
663667
disable_irq(cci->irq);
@@ -673,8 +677,10 @@ static int cci_remove(struct platform_device *pdev)
673677
int i;
674678

675679
for (i = 0; i < cci->data->num_masters; i++) {
676-
if (cci->master[i].cci)
680+
if (cci->master[i].cci) {
677681
i2c_del_adapter(&cci->master[i].adap);
682+
of_node_put(cci->master[i].adap.dev.of_node);
683+
}
678684
cci_halt(cci, i);
679685
}
680686

0 commit comments

Comments
 (0)