Thread (7 messages) 7 messages, 5 authors, 2021-11-18

Re: [PATCH] extcon: fix extcon_get_extcon_dev() error handling

From: Guenter Roeck <linux@roeck-us.net>
Date: 2021-11-18 18:16:48
Also in: kernel-janitors, linux-omap, linux-pm, lkml

On Thu, Nov 18, 2021 at 05:51:35PM +0300, Dan Carpenter wrote:
On Thu, Nov 18, 2021 at 06:22:58AM -0800, Guenter Roeck wrote:
quoted
On 11/18/21 3:32 AM, Dan Carpenter wrote:
quoted
The extcon_get_extcon_dev() function returns error pointers on error
and NULL when it's a -EPROBE_DEFER defer situation.  There are eight
callers and only two of them handled this correctly.  In the other
callers an error pointer return would lead to a crash.

What prevents crashes is that errors can only happen in the case of
a bug in the caller or if CONFIG_EXTCON is disabled.  Six out of
eight callers use the Kconfig to either depend on or select
CONFIG_EXTCON.  Thus the real life impact of these bugs is tiny.

Signed-off-by: Dan Carpenter <redacted>
---
The two callers where the drivers can be built without CONFIG_EXTCON
are TYPEC_FUSB302 and CHARGER_MAX8997.
[ ... ]
quoted
diff --git a/drivers/usb/typec/tcpm/fusb302.c b/drivers/usb/typec/tcpm/fusb302.c
index 7a2a17866a82..8594b59bd527 100644
--- a/drivers/usb/typec/tcpm/fusb302.c
+++ b/drivers/usb/typec/tcpm/fusb302.c
@@ -1706,8 +1706,8 @@ static int fusb302_probe(struct i2c_client *client,
  	 */
  	if (device_property_read_string(dev, "linux,extcon-name", &name) == 0) {
  		chip->extcon = extcon_get_extcon_dev(name);
-		if (!chip->extcon)
-			return -EPROBE_DEFER;
+		if (IS_ERR(chip->extcon))
+			return PTR_ERR(chip->extcon);
Why does the code not need to return -EPROBE_DEFER ? The description states
that NULL is returned in that situation. Doesn't that mean that defer situations
are no longer handled with this patch in place ?
I'm not sure I understand what you are saying here.  In the original
code, extcon_get_extcon_dev() would return NULL and relied on the
callers to change NULL into a -EPROBE_DEFER.  If extcon_get_extcon_dev()
returned ERR_PTR(-EINVAL) (which is impossible as mentioned) the it
would lead to a crash.

In the new code, the extcon_get_extcon_dev() function returns
-EPROBE_DEFER directly so the caller code is much simpler.
Misunderstanding on my side. I didn't get that extcon_get_extcon_dev()
now returns -EPROBE_DEFER.
quoted
Also, with this patch in place, the code will no longer work if extcon is disabled,
because extcon_get_extcon_dev() will return -ENODEV and the above code will bail out.
The behavior of the code wasn't optimal in that case (it would wait until timeout
in tcpm_get_current_limit() before returning), but at least it didn't fail.
Huh.  You are right.  Initialy I thought that tcpm_get_current_limit()
would crash.  This is one of the two drivers which I mentioned that can
be built without CONFIG_EXTCON.

I will modify the version of extcon_get_extcon_dev() where CONFIG_EXTCON
is disabled to return NULL.  That is the standard/correct way to write
these.  That will turn tcpm_get_current_limit() into a no-op.

A belt and suspenders approach might be to modify the Kconfig so this
driver selects CONFIG_EXTCON.
That would pull in unnecessary extra code, though, if the driver is supposed
to be able to work without it.

Thanks,
Guenter
regards,
dan carpenter
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help