All of lore.kernel.org
 help / color / mirror / Atom feed
From: Heikki Krogerus <heikki.krogerus@linux.intel.com>
To: kernel-janitors@vger.kernel.org
Subject: Re: device property: fix for a case of use-after-free
Date: Mon, 25 Apr 2016 13:19:57 +0000	[thread overview]
Message-ID: <20160425131957.GA26200@kuha.fi.intel.com> (raw)
In-Reply-To: <20160425113408.GA6175@mwanda>

Hi Dan,

On Mon, Apr 25, 2016 at 02:34:08PM +0300, Dan Carpenter wrote:
> Hi Heikki Krogerus,
> 
> The patch 0d67e0fa1664: "device property: fix for a case of
> use-after-free" from Mar 10, 2016, has an issue.
> 
> Assume "fwnode" is an ERR_PTR>
> 
> drivers/base/property.c
>    204  static bool __fwnode_property_present(struct fwnode_handle *fwnode,
>    205                                        const char *propname)
>    206  {
>    207          if (is_of_node(fwnode))
>                                ^^^^^^
> We dereference it here.

Hmm. It looks like that function also just checks fwnode and not
IS_ERR_OR_NULL(fwnode)..

>    208                  return of_property_read_bool(to_of_node(fwnode), propname);
>    209          else if (is_acpi_node(fwnode))
>    210                  return !acpi_node_prop_get(fwnode, propname, NULL);
>    211          else if (is_pset_node(fwnode))
>    212                  return !!pset_prop_get(to_pset_node(fwnode), propname);
>    213          return false;
> 
> Some of these depend on the .config but I don't see a path through this
> function where fwnode can be an ERR_PTR and we don't oops.
> 
>    214  }
>    215  
>    216  /**
>    217   * fwnode_property_present - check if a property of a firmware node is present
>    218   * @fwnode: Firmware node whose property to check
>    219   * @propname: Name of the property
>    220   */
>    221  bool fwnode_property_present(struct fwnode_handle *fwnode, const char *propname)
>    222  {
>    223          bool ret;
>    224  
>    225          ret = __fwnode_property_present(fwnode, propname);
>                                                 ^^^^^^^
> We oops here.
> 
>    226          if (ret = false && !IS_ERR_OR_NULL(fwnode) &&
>                                      ^^^^^^^^^^^^^^^^^^^^^^
> This check for IS_ERR is too late because we already oopsed on the line
> before.
> 
>    227              !IS_ERR_OR_NULL(fwnode->secondary))
>    228                  ret = __fwnode_property_present(fwnode->secondary, propname);
>    229          return ret;
>    230  }

Does this fix the issue for you? I noticed that the other types don't
check it any more then of:


diff --git a/drivers/base/property.c b/drivers/base/property.c
index 9b1a65d..7f692ac 100644
--- a/drivers/base/property.c
+++ b/drivers/base/property.c
@@ -21,7 +21,7 @@
 
 static inline bool is_pset_node(struct fwnode_handle *fwnode)
 {
-       return fwnode && fwnode->type = FWNODE_PDATA;
+       return !IS_ERR_OR_NULL(fwnode) && fwnode->type = FWNODE_PDATA;
 }
 
 static inline struct property_set *to_pset_node(struct fwnode_handle *fwnode)
diff --git a/include/acpi/acpi_bus.h b/include/acpi/acpi_bus.h
index 14362a8..3a93250 100644
--- a/include/acpi/acpi_bus.h
+++ b/include/acpi/acpi_bus.h
@@ -394,13 +394,13 @@ struct acpi_data_node {
 
 static inline bool is_acpi_node(struct fwnode_handle *fwnode)
 {
-       return fwnode && (fwnode->type = FWNODE_ACPI
+       return !IS_ERR_OR_NULL(fwnode) && (fwnode->type = FWNODE_ACPI
                || fwnode->type = FWNODE_ACPI_DATA);
 }
 
 static inline bool is_acpi_device_node(struct fwnode_handle *fwnode)
 {
-       return fwnode && fwnode->type = FWNODE_ACPI;
+       return !IS_ERR_OR_NULL(fwnode) && fwnode->type = FWNODE_ACPI;
 }
 
 static inline struct acpi_device *to_acpi_device_node(struct fwnode_handle *fwnode)
diff --git a/include/linux/of.h b/include/linux/of.h
index 7fcb681..3175803 100644
--- a/include/linux/of.h
+++ b/include/linux/of.h
@@ -133,7 +133,7 @@ void of_core_init(void);
 
 static inline bool is_of_node(struct fwnode_handle *fwnode)
 {
-       return fwnode && fwnode->type = FWNODE_OF;
+       return !IS_ERR_OR_NULL(fwnode) && fwnode->type = FWNODE_OF;
 }
 
 static inline struct device_node *to_of_node(struct fwnode_handle *fwnode)


Thanks,

-- 
heikki

  reply	other threads:[~2016-04-25 13:19 UTC|newest]

Thread overview: 3+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2016-04-25 11:34 device property: fix for a case of use-after-free Dan Carpenter
2016-04-25 13:19 ` Heikki Krogerus [this message]
2016-04-25 14:19 ` Dan Carpenter

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20160425131957.GA26200@kuha.fi.intel.com \
    --to=heikki.krogerus@linux.intel.com \
    --cc=kernel-janitors@vger.kernel.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.