From: Marek Lindner <mareklindner@neomailbox.ch>
To: b.a.t.m.a.n@lists.open-mesh.org
Subject: Re: [B.A.T.M.A.N.] [PATCH maint v3] batman-adv: Fix use-after-free/double-free of tt_req_node
Date: Mon, 06 Jun 2016 23:24:45 +0800 [thread overview]
Message-ID: <1579809.XPBnnFdxxn@voltaire> (raw)
In-Reply-To: <1465023132-19011-1-git-send-email-sven@narfation.org>
[-- Attachment #1: Type: text/plain, Size: 2801 bytes --]
On Saturday, June 04, 2016 08:52:12 Sven Eckelmann wrote:
> The tt_req_node is added and removed from a list inside a spinlock. But the
> locking is sometimes removed even when the object is still referenced and
> will be used later via this reference. For example batadv_send_tt_request
> can create a new tt_req_node (including add to a list) and later
> re-acquires the lock to remove it from the list and to free it. But at this
> time another context could have already removed this tt_req_node from the
> list and freed it.
>
> CPU#0
>
> batadv_batman_skb_recv from net_device 0
> -> batadv_iv_ogm_receive
> -> batadv_iv_ogm_process
> -> batadv_iv_ogm_process_per_outif
> -> batadv_tvlv_ogm_receive
> -> batadv_tvlv_ogm_receive
> -> batadv_tvlv_containers_process
> -> batadv_tvlv_call_handler
> -> batadv_tt_tvlv_ogm_handler_v1
> -> batadv_tt_update_orig
> -> batadv_send_tt_request
> -> batadv_tt_req_node_new
> spin_lock(...)
> allocates new tt_req_node and adds it to list
> spin_unlock(...)
> return tt_req_node
>
> CPU#1
>
> batadv_batman_skb_recv from net_device 1
> -> batadv_recv_unicast_tvlv
> -> batadv_tvlv_containers_process
> -> batadv_tvlv_call_handler
> -> batadv_tt_tvlv_unicast_handler_v1
> -> batadv_handle_tt_response
> spin_lock(...)
> tt_req_node gets removed from list and is freed
> spin_unlock(...)
>
> CPU#0
>
> <- returned to batadv_send_tt_request
> spin_lock(...)
> tt_req_node gets removed from list and is freed
> MEMORY CORRUPTION/SEGFAULT/...
> spin_unlock(...)
>
> This can only be solved via reference counting to allow multiple contexts
> to handle the list manipulation while making sure that only the last
> context holding a reference will free the object.
>
> Fixes: cea194d90b11 ("batman-adv: improved client announcement mechanism")
> Signed-off-by: Sven Eckelmann <sven@narfation.org>
> Tested-by: Martin Weinelt <martin@darmstadt.freifunk.net>
> ---
> v3:
> - add wrapper function batadv_tt_req_node_put for kref_put(....)
> v2:
> - fixed list->object in commit message
> - add example what could have gone wrong in commit message
> ---
> net/batman-adv/translation-table.c | 37
> +++++++++++++++++++++++++++++++++----
> net/batman-adv/types.h | 2 ++
> 2 files changed, 35 insertions(+), 4 deletions(-)
Applied in revision c3fef3d.
Thanks,
Marek
[-- Attachment #2: This is a digitally signed message part. --]
[-- Type: application/pgp-signature, Size: 473 bytes --]
prev parent reply other threads:[~2016-06-06 15:24 UTC|newest]
Thread overview: 2+ messages / expand[flat|nested] mbox.gz Atom feed top
2016-06-04 6:52 [B.A.T.M.A.N.] [PATCH maint v3] batman-adv: Fix use-after-free/double-free of tt_req_node Sven Eckelmann
2016-06-06 15:24 ` Marek Lindner [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=1579809.XPBnnFdxxn@voltaire \
--to=mareklindner@neomailbox.ch \
--cc=b.a.t.m.a.n@lists.open-mesh.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.