From: Marcelo Ricardo Leitner <marcelo.leitner@gmail.com>
To: Vegard Nossum <vegard.nossum@oracle.com>
Cc: Vlad Yasevich <vyasevich@gmail.com>,
Neil Horman <nhorman@tuxdriver.com>,
linux-sctp@vger.kernel.org,
"David S. Miller" <davem@davemloft.net>,
netdev@vger.kernel.org, Xin Long <lucien.xin@gmail.com>,
Herbert Xu <herbert@gondor.apana.org.au>,
"Eric W. Biederman" <ebiederm@xmission.com>,
stable@vger.kernel.org
Subject: Re: [PATCH] net/sctp: always initialise sctp_ht_iter::start_fail
Date: Sat, 23 Jul 2016 13:39:29 +0000 [thread overview]
Message-ID: <20160723133929.GG9950@localhost.localdomain> (raw)
In-Reply-To: <1469267543-24650-1-git-send-email-vegard.nossum@oracle.com>
On Sat, Jul 23, 2016 at 11:52:23AM +0200, Vegard Nossum wrote:
> seq_read() can call ->start() twice on the same iterator more than once
> (e.g. once through traverse() and once in seq_read() itself).
But when traverse() returns the error, it goes to Done label, skipping
the call to ->start() from seq_read(), or am I missing something?
Though yes, if sctp_ht_iter memory is actually re-used without
initializting between seq_read()s, it triggers the issue you described.
How did you trigger this, reading after an error on the file descriptor?
>
> We should initialize sctp_ht_iter::start_fail to zero if ->start()
> succeeds, otherwise it's possible that we leave an old value of 1 there,
> which will cause ->stop() to not call sctp_transport_walk_stop(), which
> causes all sorts of problems like not calling rcu_read_unlock() (and
> preempt_enable()), eventually leading to more warnings like this:
>
> BUG: sleeping function called from invalid context at mm/slab.h:388
> in_atomic(): 0, irqs_disabled(): 0, pid: 16551, name: trinity-c2
> Preemption disabled at:[<ffffffff819bceb6>] rhashtable_walk_start+0x46/0x150
>
> [<ffffffff81149abb>] preempt_count_add+0x1fb/0x280
> [<ffffffff83295892>] _raw_spin_lock+0x12/0x40
> [<ffffffff819bceb6>] rhashtable_walk_start+0x46/0x150
> [<ffffffff82ec665f>] sctp_transport_walk_start+0x2f/0x60
> [<ffffffff82edda1d>] sctp_transport_seq_start+0x4d/0x150
> [<ffffffff81439e50>] traverse+0x170/0x850
> [<ffffffff8143aeec>] seq_read+0x7cc/0x1180
> [<ffffffff814f996c>] proc_reg_read+0xbc/0x180
> [<ffffffff813d0384>] do_loop_readv_writev+0x134/0x210
> [<ffffffff813d2a95>] do_readv_writev+0x565/0x660
> [<ffffffff813d6857>] vfs_readv+0x67/0xa0
> [<ffffffff813d6c16>] do_preadv+0x126/0x170
> [<ffffffff813d710c>] SyS_preadv+0xc/0x10
> [<ffffffff8100334c>] do_syscall_64+0x19c/0x410
> [<ffffffff83296225>] return_from_SYSCALL_64+0x0/0x6a
> [<ffffffffffffffff>] 0xffffffffffffffff
>
> (Notice that this is a subtly different stacktrace from the previous bug
> I reported.)
>
> Cc: Xin Long <lucien.xin@gmail.com>
> Cc: Herbert Xu <herbert@gondor.apana.org.au>
> Cc: Eric W. Biederman <ebiederm@xmission.com>
> Cc: stable@vger.kernel.org
> Signed-off-by: Vegard Nossum <vegard.nossum@oracle.com>
> ---
> net/sctp/proc.c | 1 +
> 1 file changed, 1 insertion(+)
>
> diff --git a/net/sctp/proc.c b/net/sctp/proc.c
> index 4cb5aed..ef8ba77 100644
> --- a/net/sctp/proc.c
> +++ b/net/sctp/proc.c
> @@ -293,6 +293,7 @@ static void *sctp_transport_seq_start(struct seq_file *seq, loff_t *pos)
> return ERR_PTR(err);
> }
>
> + iter->start_fail = 0;
> return sctp_transport_get_idx(seq_file_net(seq), &iter->hti, *pos);
> }
>
> --
> 1.9.1
>
> --
> To unsubscribe from this list: send the line "unsubscribe linux-sctp" in
> the body of a message to majordomo@vger.kernel.org
> More majordomo info at http://vger.kernel.org/majordomo-info.html
>
WARNING: multiple messages have this Message-ID (diff)
From: Marcelo Ricardo Leitner <marcelo.leitner@gmail.com>
To: Vegard Nossum <vegard.nossum@oracle.com>
Cc: Vlad Yasevich <vyasevich@gmail.com>,
Neil Horman <nhorman@tuxdriver.com>,
linux-sctp@vger.kernel.org,
"David S. Miller" <davem@davemloft.net>,
netdev@vger.kernel.org, Xin Long <lucien.xin@gmail.com>,
Herbert Xu <herbert@gondor.apana.org.au>,
"Eric W. Biederman" <ebiederm@xmission.com>,
stable@vger.kernel.org
Subject: Re: [PATCH] net/sctp: always initialise sctp_ht_iter::start_fail
Date: Sat, 23 Jul 2016 10:39:29 -0300 [thread overview]
Message-ID: <20160723133929.GG9950@localhost.localdomain> (raw)
In-Reply-To: <1469267543-24650-1-git-send-email-vegard.nossum@oracle.com>
On Sat, Jul 23, 2016 at 11:52:23AM +0200, Vegard Nossum wrote:
> seq_read() can call ->start() twice on the same iterator more than once
> (e.g. once through traverse() and once in seq_read() itself).
But when traverse() returns the error, it goes to Done label, skipping
the call to ->start() from seq_read(), or am I missing something?
Though yes, if sctp_ht_iter memory is actually re-used without
initializting between seq_read()s, it triggers the issue you described.
How did you trigger this, reading after an error on the file descriptor?
>
> We should initialize sctp_ht_iter::start_fail to zero if ->start()
> succeeds, otherwise it's possible that we leave an old value of 1 there,
> which will cause ->stop() to not call sctp_transport_walk_stop(), which
> causes all sorts of problems like not calling rcu_read_unlock() (and
> preempt_enable()), eventually leading to more warnings like this:
>
> BUG: sleeping function called from invalid context at mm/slab.h:388
> in_atomic(): 0, irqs_disabled(): 0, pid: 16551, name: trinity-c2
> Preemption disabled at:[<ffffffff819bceb6>] rhashtable_walk_start+0x46/0x150
>
> [<ffffffff81149abb>] preempt_count_add+0x1fb/0x280
> [<ffffffff83295892>] _raw_spin_lock+0x12/0x40
> [<ffffffff819bceb6>] rhashtable_walk_start+0x46/0x150
> [<ffffffff82ec665f>] sctp_transport_walk_start+0x2f/0x60
> [<ffffffff82edda1d>] sctp_transport_seq_start+0x4d/0x150
> [<ffffffff81439e50>] traverse+0x170/0x850
> [<ffffffff8143aeec>] seq_read+0x7cc/0x1180
> [<ffffffff814f996c>] proc_reg_read+0xbc/0x180
> [<ffffffff813d0384>] do_loop_readv_writev+0x134/0x210
> [<ffffffff813d2a95>] do_readv_writev+0x565/0x660
> [<ffffffff813d6857>] vfs_readv+0x67/0xa0
> [<ffffffff813d6c16>] do_preadv+0x126/0x170
> [<ffffffff813d710c>] SyS_preadv+0xc/0x10
> [<ffffffff8100334c>] do_syscall_64+0x19c/0x410
> [<ffffffff83296225>] return_from_SYSCALL_64+0x0/0x6a
> [<ffffffffffffffff>] 0xffffffffffffffff
>
> (Notice that this is a subtly different stacktrace from the previous bug
> I reported.)
>
> Cc: Xin Long <lucien.xin@gmail.com>
> Cc: Herbert Xu <herbert@gondor.apana.org.au>
> Cc: Eric W. Biederman <ebiederm@xmission.com>
> Cc: stable@vger.kernel.org
> Signed-off-by: Vegard Nossum <vegard.nossum@oracle.com>
> ---
> net/sctp/proc.c | 1 +
> 1 file changed, 1 insertion(+)
>
> diff --git a/net/sctp/proc.c b/net/sctp/proc.c
> index 4cb5aed..ef8ba77 100644
> --- a/net/sctp/proc.c
> +++ b/net/sctp/proc.c
> @@ -293,6 +293,7 @@ static void *sctp_transport_seq_start(struct seq_file *seq, loff_t *pos)
> return ERR_PTR(err);
> }
>
> + iter->start_fail = 0;
> return sctp_transport_get_idx(seq_file_net(seq), &iter->hti, *pos);
> }
>
> --
> 1.9.1
>
> --
> To unsubscribe from this list: send the line "unsubscribe linux-sctp" in
> the body of a message to majordomo@vger.kernel.org
> More majordomo info at http://vger.kernel.org/majordomo-info.html
>
next prev parent reply other threads:[~2016-07-23 13:39 UTC|newest]
Thread overview: 8+ messages / expand[flat|nested] mbox.gz Atom feed top
2016-07-23 9:52 [PATCH] net/sctp: always initialise sctp_ht_iter::start_fail Vegard Nossum
2016-07-23 9:52 ` Vegard Nossum
2016-07-23 13:39 ` Marcelo Ricardo Leitner [this message]
2016-07-23 13:39 ` Marcelo Ricardo Leitner
2016-07-23 14:00 ` Vegard Nossum
2016-07-23 14:00 ` Vegard Nossum
2016-07-23 14:15 ` Marcelo Ricardo Leitner
2016-07-23 14:15 ` Marcelo Ricardo Leitner
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=20160723133929.GG9950@localhost.localdomain \
--to=marcelo.leitner@gmail.com \
--cc=davem@davemloft.net \
--cc=ebiederm@xmission.com \
--cc=herbert@gondor.apana.org.au \
--cc=linux-sctp@vger.kernel.org \
--cc=lucien.xin@gmail.com \
--cc=netdev@vger.kernel.org \
--cc=nhorman@tuxdriver.com \
--cc=stable@vger.kernel.org \
--cc=vegard.nossum@oracle.com \
--cc=vyasevich@gmail.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.