From: Dave Hansen <dave@linux.vnet.ibm.com>
To: David Rientjes <rientjes@google.com>
Cc: Andrew Morton <akpm@linux-foundation.org>, linux-kernel@vger.kernel.org
Subject: Re: [patch 1/3] flex_array: fix get function for elements in base starting at non-zero
Date: Tue, 18 Aug 2009 09:03:06 -0700 [thread overview]
Message-ID: <1250611386.7335.8.camel@nimitz> (raw)
In-Reply-To: <alpine.DEB.2.00.0908171644540.30313@chino.kir.corp.google.com>
On Mon, 2009-08-17 at 16:46 -0700, David Rientjes wrote:
> If all array elements fit into the base structure and data is copied
> using flex_array_put() starting at a non-zero index, flex_array_get()
> will fail to return the data.
>
> This fixes the bug by only checking for NULL parts when all elements do
> not fit in the base structure when flex_array_get() is used. Otherwise,
> fa_element_to_part_nr() will always be 0 since there are no parts
> structures needed and such element may never have been put. Thus, it
> will remain NULL due to the kzalloc() of the base.
>
> Additionally, flex_array_put() now only checks for a NULL part when all
> elements do not fit in the base structure. This is otherwise unnecessary
> since the base structure is guaranteed to exist (or we would have already
> hit a NULL pointer).
>
> Cc: Dave Hansen <dave@linux.vnet.ibm.com>
> Signed-off-by: David Rientjes <rientjes@google.com>
> ---
> lib/flex_array.c | 14 ++++++++------
> 1 files changed, 8 insertions(+), 6 deletions(-)
>
> diff --git a/lib/flex_array.c b/lib/flex_array.c
> --- a/lib/flex_array.c
> +++ b/lib/flex_array.c
> @@ -198,10 +198,11 @@ int flex_array_put(struct flex_array *fa, int element_nr, void *src, gfp_t flags
> return -ENOSPC;
> if (elements_fit_in_base(fa))
> part = (struct flex_array_part *)&fa->parts[0];
> - else
> + else {
> part = __fa_get_part(fa, part_nr, flags);
> - if (!part)
> - return -ENOMEM;
> + if (!part)
> + return -ENOMEM;
> + }
> dst = &part->elements[index_inside_part(fa, element_nr)];
> memcpy(dst, src, fa->element_size);
> return 0;
> @@ -257,11 +258,12 @@ void *flex_array_get(struct flex_array *fa, int element_nr)
>
> if (element_nr >= fa->total_nr_elements)
> return NULL;
> - if (!fa->parts[part_nr])
> - return NULL;
> if (elements_fit_in_base(fa))
> part = (struct flex_array_part *)&fa->parts[0];
> - else
> + else {
> part = fa->parts[part_nr];
> + if (!part)
> + return NULL;
> + }
> return &part->elements[index_inside_part(fa, element_nr)];
> }
This is fine with me, and fixes the bug you describe.
--
Signed-off-by: Dave Hansen <dave@linux.vnet.ibm.com>
-- Dave
prev parent reply other threads:[~2009-08-18 18:00 UTC|newest]
Thread overview: 9+ messages / expand[flat|nested] mbox.gz Atom feed top
2009-08-17 23:46 [patch 1/3] flex_array: fix get function for elements in base starting at non-zero David Rientjes
2009-08-17 23:46 ` [patch 2/3] flex_array: fix flex_array_free_parts comment David Rientjes
2009-08-18 0:06 ` Dave Hansen
2009-08-17 23:46 ` [patch 3/3] flex_array: declare parts member to have incomplete type David Rientjes
2009-08-18 0:07 ` Dave Hansen
2009-08-18 0:19 ` [patch 1/3] flex_array: fix get function for elements in base starting at non-zero Dave Hansen
2009-08-18 0:49 ` David Rientjes
2009-08-18 1:46 ` Dave Hansen
2009-08-18 16:03 ` Dave Hansen [this message]
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=1250611386.7335.8.camel@nimitz \
--to=dave@linux.vnet.ibm.com \
--cc=akpm@linux-foundation.org \
--cc=linux-kernel@vger.kernel.org \
--cc=rientjes@google.com \
/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.