On Wed, Jun 09, 2010 at 08:32:59PM +0200, Johannes Berg wrote:
> On Wed, 2010-06-09 at 15:19 -0300, Thadeu Lima de Souza Cascardo wrote:
> 
> > > >+        ipml->rf = rfkill_alloc("cmpc_rfkill", &acpi->dev, 
> > > >RFKILL_TYPE_WLAN,
> > > >+                                &cmpc_rfkill_ops, acpi->handle);
> > > >+        /* rfkill_alloc may fail if RFKILL is disabled. We should still 
> > > >work
> > > >+         * anyway. */
> > > >+        if (!IS_ERR(ipml->rf)) {
> > > >+                retval = rfkill_register(ipml->rf);
> > > >+                if (retval) {
> > > >+                        rfkill_destroy(ipml->rf);
> > > >+                        ipml->rf = NULL;
> > > >+                }
> > > >+        } else {
> > > >+                ipml->rf = NULL;
> > > >+        }
> > > 
> > > I think the comment is wrong, and so is the code it references.
> > > 
> > > rfkill_alloc() is documented as returning NULL on failure, not an
> > ERR_PTR.  So you're going to pass NULL into rfkill_register() on
> > allocation failure, which will BUG out.
> > > 
> > 
> > Gee! At the time, I only read the RFKILL=n implementation in the
> > header.
> > It returns ERR_PTR(-ENODEV), while the RFKILL=y implementation does
> > indeed return NULL. This is inconsistent interface, and we'd better
> > fix it, in my opinion. But for the time, we must fix the users here.
> 
> No, it's perfectly consistent. RFKILL=n returns non-NULL on success,
> just as RFKILL=y/m. It's just defined to be always successful for
> RFKILL=n, with the special case that it's returning an ERR_PTR for its
> own checking in rfkill_register.
> 
> All the drivers should do is test for NULL, and if non-NULL proceed as
> normal.
> 
> > I see why eeepc_laptop would still work right now. But I think it's
> > risky for the casual driver writer to trust the rfkill device is there
> > while it isn't. If this is by design, to bite those driver writers
> > that
> > do "stupid" things (like not using the right interface) and that they
> > should still manipulate hardware as if the rfkill device was there,
> > that's OK. But is this really by design or should we fix it? For
> > example, eeepc_laptop does all the wlan pci device hotplug stuff and
> > also write some ACPI values. And it will do that if RFKILL is disabled
> > but will not do it if RFKILL is enabled but device allocation fails.
> > So,
> > should we document that ERR_PTR(-ENODEV) is not a failure, but a
> > "dummy"?
> 
> That's the intended outcome, yes, so that drivers need NOT worry about
> whether RFKILL is built into the system or not at all.
> 
> johannes
> 

Thanks, Johannes.

I think this is a fix for 2.6.35, then. Otherwise, we get a BUG_ON in
case rfkill_alloc fails. If there was not a BUG_ON at rfkill_register,
there would be a NULL pointer dereference.

I will check the driver for the RFKILL=n case. If it's sane, I'll just
change the check for the NULL check.

Best regards,
Cascardo.

Attachment: signature.asc
Description: Digital signature

Reply via email to