lkml.org 
[lkml]   [2018]   [Feb]   [23]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 4.4 019/193] netfilter: xt_RATEEST: acquire xt_rateest_mutex for hash insert
    Date
    4.4-stable review patch.  If anyone has any objections, please let me know.

    ------------------

    From: Cong Wang <xiyou.wangcong@gmail.com>

    commit 7dc68e98757a8eccf8ca7a53a29b896f1eef1f76 upstream.

    rateest_hash is supposed to be protected by xt_rateest_mutex,
    and, as suggested by Eric, lookup and insert should be atomic,
    so we should acquire the xt_rateest_mutex once for both.

    So introduce a non-locking helper for internal use and keep the
    locking one for external.

    Reported-by: <syzbot+5cb189720978275e4c75@syzkaller.appspotmail.com>
    Fixes: 5859034d7eb8 ("[NETFILTER]: x_tables: add RATEEST target")
    Signed-off-by: Cong Wang <xiyou.wangcong@gmail.com>
    Reviewed-by: Florian Westphal <fw@strlen.de>
    Reviewed-by: Eric Dumazet <edumazet@google.com>
    Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

    ---
    net/netfilter/xt_RATEEST.c | 22 +++++++++++++++++-----
    1 file changed, 17 insertions(+), 5 deletions(-)

    --- a/net/netfilter/xt_RATEEST.c
    +++ b/net/netfilter/xt_RATEEST.c
    @@ -40,23 +40,31 @@ static void xt_rateest_hash_insert(struc
    hlist_add_head(&est->list, &rateest_hash[h]);
    }

    -struct xt_rateest *xt_rateest_lookup(const char *name)
    +static struct xt_rateest *__xt_rateest_lookup(const char *name)
    {
    struct xt_rateest *est;
    unsigned int h;

    h = xt_rateest_hash(name);
    - mutex_lock(&xt_rateest_mutex);
    hlist_for_each_entry(est, &rateest_hash[h], list) {
    if (strcmp(est->name, name) == 0) {
    est->refcnt++;
    - mutex_unlock(&xt_rateest_mutex);
    return est;
    }
    }
    - mutex_unlock(&xt_rateest_mutex);
    +
    return NULL;
    }
    +
    +struct xt_rateest *xt_rateest_lookup(const char *name)
    +{
    + struct xt_rateest *est;
    +
    + mutex_lock(&xt_rateest_mutex);
    + est = __xt_rateest_lookup(name);
    + mutex_unlock(&xt_rateest_mutex);
    + return est;
    +}
    EXPORT_SYMBOL_GPL(xt_rateest_lookup);

    void xt_rateest_put(struct xt_rateest *est)
    @@ -104,8 +112,10 @@ static int xt_rateest_tg_checkentry(cons
    rnd_inited = true;
    }

    - est = xt_rateest_lookup(info->name);
    + mutex_lock(&xt_rateest_mutex);
    + est = __xt_rateest_lookup(info->name);
    if (est) {
    + mutex_unlock(&xt_rateest_mutex);
    /*
    * If estimator parameters are specified, they must match the
    * existing estimator.
    @@ -143,11 +153,13 @@ static int xt_rateest_tg_checkentry(cons

    info->est = est;
    xt_rateest_hash_insert(est);
    + mutex_unlock(&xt_rateest_mutex);
    return 0;

    err2:
    kfree(est);
    err1:
    + mutex_unlock(&xt_rateest_mutex);
    return ret;
    }


    \
     
     \ /
      Last update: 2018-02-23 19:34    [W:4.025 / U:0.208 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site