All of lore.kernel.org
 help / color / mirror / Atom feed
From: Andrii Nakryiko <andrii.nakryiko@gmail.com>
To: Ian Rogers <irogers@google.com>
Cc: Alexei Starovoitov <ast@kernel.org>,
	Daniel Borkmann <daniel@iogearbox.net>,
	Martin KaFai Lau <kafai@fb.com>, Song Liu <songliubraving@fb.com>,
	Yonghong Song <yhs@fb.com>, Andrii Nakryiko <andriin@fb.com>,
	John Fastabend <john.fastabend@gmail.com>,
	KP Singh <kpsingh@chromium.org>,
	Networking <netdev@vger.kernel.org>, bpf <bpf@vger.kernel.org>,
	open list <linux-kernel@vger.kernel.org>
Subject: Re: [PATCH v2] libbpf hashmap: Fix undefined behavior in hash_bits
Date: Thu, 29 Oct 2020 15:38:52 -0700	[thread overview]
Message-ID: <CAEf4BzaX4KT5tOn9gSR24OtrX8MT3yW2yfTq244ewnRouWDJdA@mail.gmail.com> (raw)
In-Reply-To: <20201029223707.494059-1-irogers@google.com>

On Thu, Oct 29, 2020 at 3:38 PM Ian Rogers <irogers@google.com> wrote:
>
> If bits is 0, the case when the map is empty, then the >> is the size of
> the register which is undefined behavior - on x86 it is the same as a
> shift by 0. Fix by handling the 0 case explicitly and guarding calls to
> hash_bits for empty maps in hashmap__for_each_key_entry and
> hashmap__for_each_entry_safe.
>
> Suggested-by: Andrii Nakryiko <andriin@fb.com>,
> Signed-off-by: Ian Rogers <irogers@google.com>
> ---

Looks good. Thanks and sorry for unnecessary iterations.

Acked-by: Andrii Nakryiko <andrii@kernel.org>

>  tools/lib/bpf/hashmap.h | 15 +++++++++------
>  1 file changed, 9 insertions(+), 6 deletions(-)
>
> diff --git a/tools/lib/bpf/hashmap.h b/tools/lib/bpf/hashmap.h
> index d9b385fe808c..10a4c4cd13cf 100644
> --- a/tools/lib/bpf/hashmap.h
> +++ b/tools/lib/bpf/hashmap.h
> @@ -15,6 +15,9 @@
>  static inline size_t hash_bits(size_t h, int bits)
>  {
>         /* shuffle bits and return requested number of upper bits */
> +       if (bits == 0)
> +               return 0;
> +
>  #if (__SIZEOF_SIZE_T__ == __SIZEOF_LONG_LONG__)
>         /* LP64 case */
>         return (h * 11400714819323198485llu) >> (__SIZEOF_LONG_LONG__ * 8 - bits);
> @@ -174,17 +177,17 @@ bool hashmap__find(const struct hashmap *map, const void *key, void **value);
>   * @key: key to iterate entries for
>   */
>  #define hashmap__for_each_key_entry(map, cur, _key)                        \
> -       for (cur = ({ size_t bkt = hash_bits(map->hash_fn((_key), map->ctx),\
> -                                            map->cap_bits);                \
> -                    map->buckets ? map->buckets[bkt] : NULL; });           \
> +       for (cur = map->buckets                                             \
> +                    ? map->buckets[hash_bits(map->hash_fn((_key), map->ctx), map->cap_bits)] \
> +                    : NULL;                                                \
>              cur;                                                           \
>              cur = cur->next)                                               \
>                 if (map->equal_fn(cur->key, (_key), map->ctx))
>
>  #define hashmap__for_each_key_entry_safe(map, cur, tmp, _key)              \
> -       for (cur = ({ size_t bkt = hash_bits(map->hash_fn((_key), map->ctx),\
> -                                            map->cap_bits);                \
> -                    cur = map->buckets ? map->buckets[bkt] : NULL; });     \
> +       for (cur = map->buckets                                             \
> +                    ? map->buckets[hash_bits(map->hash_fn((_key), map->ctx), map->cap_bits)] \
> +                    : NULL;                                                \
>              cur && ({ tmp = cur->next; true; });                           \
>              cur = tmp)                                                     \
>                 if (map->equal_fn(cur->key, (_key), map->ctx))
> --
> 2.29.1.341.ge80a0c044ae-goog
>

  reply	other threads:[~2020-10-29 22:39 UTC|newest]

Thread overview: 3+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2020-10-29 22:37 [PATCH v2] libbpf hashmap: Fix undefined behavior in hash_bits Ian Rogers
2020-10-29 22:38 ` Andrii Nakryiko [this message]
2020-10-29 22:57   ` Song Liu

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=CAEf4BzaX4KT5tOn9gSR24OtrX8MT3yW2yfTq244ewnRouWDJdA@mail.gmail.com \
    --to=andrii.nakryiko@gmail.com \
    --cc=andriin@fb.com \
    --cc=ast@kernel.org \
    --cc=bpf@vger.kernel.org \
    --cc=daniel@iogearbox.net \
    --cc=irogers@google.com \
    --cc=john.fastabend@gmail.com \
    --cc=kafai@fb.com \
    --cc=kpsingh@chromium.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=netdev@vger.kernel.org \
    --cc=songliubraving@fb.com \
    --cc=yhs@fb.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.