From: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
To: Dmitry Torokhov <dmitry.torokhov@gmail.com>,
"Rafael J. Wysocki" <rjw@rjwysocki.net>
Cc: Joe Perches <joe@perches.com>,
"Rafael J. Wysocki" <rafael.j.wysocki@intel.com>,
linux-acpi@vger.kernel.org, linux-kernel@vger.kernel.org,
Mika Westerberg <mika.westerberg@linux.intel.com>,
Hans de Goede <hdegoede@redhat.com>,
Wolfram Sang <wsa@the-dreams.de>
Subject: Re: [PATCH v4 3/4] device property: constify property arrays values
Date: Thu, 02 Feb 2017 18:48:30 +0200 [thread overview]
Message-ID: <1486054110.2133.366.camel@linux.intel.com> (raw)
In-Reply-To: <20170202163918.GA21924@dtor-ws>
On Thu, 2017-02-02 at 08:39 -0800, Dmitry Torokhov wrote:
> From: Dmitry Torokhov <dmitry.torokhov@gmail.com>
>
> Data that is fed into property arrays should not be modified, so let's
> mark
> relevant pointers as const. This will allow us making source arrays as
> const/__initconst.
>
> Also fix memory leaks on errors in property_entry_copy().
While the code looks okay, I'm not sure what memory leaks you are
referring to. The idea as far as I remember was to run *free() function
if *copy() fails.
>
> Signed-off-by: Dmitry Torokhov <dmitry.torokhov@gmail.com>
> ---
>
> Not sending the rest of the series as to not clutter mailing lists too
> much...
>
> drivers/base/property.c | 66 +++++++++++++++++++++++++++++++----
> -----------
> include/linux/property.h | 12 ++++----
> 2 files changed, 51 insertions(+), 27 deletions(-)
>
> diff --git a/drivers/base/property.c b/drivers/base/property.c
> index edc09854520b..09fb9757e086 100644
> --- a/drivers/base/property.c
> +++ b/drivers/base/property.c
> @@ -682,44 +682,64 @@ int fwnode_property_match_string(struct
> fwnode_handle *fwnode,
> }
> EXPORT_SYMBOL_GPL(fwnode_property_match_string);
>
> +static int property_copy_string_array(struct property_entry *dst,
> + const struct property_entry
> *src)
> +{
> + char **d;
> + size_t nval = src->length / sizeof(*d);
> + size_t i;
> +
> + d = kcalloc(nval, sizeof(*d), GFP_KERNEL);
> + if (!d)
> + return -ENOMEM;
> +
> + for (i = 0; i < nval; i++) {
> + d[i] = kstrdup(src->pointer.str[i], GFP_KERNEL);
> + if (!d[i] && src->pointer.str[i]) {
> + while (--i >= 0)
> + kfree(d[i]);
> + kfree(d);
> + return -ENOMEM;
> + }
> + }
> +
> + dst->pointer.str = (void *)d;
> + return 0;
> +}
> +
> static int property_entry_copy(struct property_entry *dst,
> const struct property_entry *src)
> {
> - const char **d, **s;
> - size_t i, nval;
> + int error;
>
> dst->name = kstrdup(src->name, GFP_KERNEL);
> if (!dst->name)
> return -ENOMEM;
>
> if (src->is_array) {
> - if (!src->length)
> - return -ENODATA;
> + if (!src->length) {
> + error = -ENODATA;
> + goto out_free_name;
> + }
>
> if (src->is_string) {
> - nval = src->length / sizeof(const char *);
> - dst->pointer.str = kcalloc(nval, sizeof(const
> char *),
> - GFP_KERNEL);
> - if (!dst->pointer.str)
> - return -ENOMEM;
> -
> - d = dst->pointer.str;
> - s = src->pointer.str;
> - for (i = 0; i < nval; i++) {
> - d[i] = kstrdup(s[i], GFP_KERNEL);
> - if (!d[i] && s[i])
> - return -ENOMEM;
> - }
> + error = property_copy_string_array(dst, src);
> + if (error)
> + goto out_free_name;
> } else {
> dst->pointer.raw_data = kmemdup(src-
> >pointer.raw_data,
> src->length,
> GFP_KERNEL);
> - if (!dst->pointer.raw_data)
> - return -ENOMEM;
> + if (!dst->pointer.raw_data) {
> + error = -ENOMEM;
> + goto out_free_name;
> + }
> }
> } else if (src->is_string) {
> dst->value.str = kstrdup(src->value.str, GFP_KERNEL);
> - if (!dst->value.str && src->value.str)
> - return -ENOMEM;
> + if (!dst->value.str && src->value.str) {
> + error = -ENOMEM;
> + goto out_free_name;
> + }
> } else {
> dst->value.raw_data = src->value.raw_data;
> }
> @@ -729,6 +749,10 @@ static int property_entry_copy(struct
> property_entry *dst,
> dst->is_string = src->is_string;
>
> return 0;
> +
> +out_free_name:
> + kfree(dst->name);
> + return error;
> }
>
> /**
> diff --git a/include/linux/property.h b/include/linux/property.h
> index 5746e9927016..64e3a9c6d95f 100644
> --- a/include/linux/property.h
> +++ b/include/linux/property.h
> @@ -160,12 +160,12 @@ struct property_entry {
> bool is_string;
> union {
> union {
> - void *raw_data;
> - u8 *u8_data;
> - u16 *u16_data;
> - u32 *u32_data;
> - u64 *u64_data;
> - const char **str;
> + const void *raw_data;
> + const u8 *u8_data;
> + const u16 *u16_data;
> + const u32 *u32_data;
> + const u64 *u64_data;
> + const char * const *str;
> } pointer;
> union {
> unsigned long long raw_data;
--
Andy Shevchenko <andriy.shevchenko@linux.intel.com>
Intel Finland Oy
next prev parent reply other threads:[~2017-02-02 16:50 UTC|newest]
Thread overview: 19+ messages / expand[flat|nested] mbox.gz Atom feed top
2017-02-01 17:31 [PATCH v3 0/4] Export APIs to copy device properties & more Dmitry Torokhov
2017-02-01 17:31 ` [PATCH v3 1/4] device property: export code duplicating array of property entries Dmitry Torokhov
2017-02-01 17:31 ` [PATCH v3 2/4] device property: allow to constify properties Dmitry Torokhov
2017-02-01 17:31 ` [PATCH v3 3/4] driver property: constify property arrays values Dmitry Torokhov
2017-02-01 23:30 ` Joe Perches
2017-02-02 11:24 ` Rafael J. Wysocki
2017-02-02 16:39 ` [PATCH v4 3/4] device " Dmitry Torokhov
2017-02-02 16:48 ` Andy Shevchenko [this message]
2017-02-02 17:07 ` Dmitry Torokhov
2017-02-02 17:52 ` Andy Shevchenko
2017-02-02 18:38 ` Dmitry Torokhov
2017-02-02 23:16 ` Rafael J. Wysocki
2017-02-03 0:16 ` Dmitry Torokhov
2017-02-03 0:37 ` Rafael J. Wysocki
2017-02-03 1:06 ` Dmitry Torokhov
2017-02-02 10:08 ` [PATCH v3 3/4] driver " Mika Westerberg
2017-02-01 17:31 ` [PATCH v3 4/4] i2c: allow specify device properties in i2c_board_info Dmitry Torokhov
2017-02-02 10:08 ` Mika Westerberg
2017-02-01 22:56 ` [PATCH v3 0/4] Export APIs to copy device properties & more Dmitry Torokhov
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=1486054110.2133.366.camel@linux.intel.com \
--to=andriy.shevchenko@linux.intel.com \
--cc=dmitry.torokhov@gmail.com \
--cc=hdegoede@redhat.com \
--cc=joe@perches.com \
--cc=linux-acpi@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=mika.westerberg@linux.intel.com \
--cc=rafael.j.wysocki@intel.com \
--cc=rjw@rjwysocki.net \
--cc=wsa@the-dreams.de \
/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.