All of lore.kernel.org
 help / color / mirror / Atom feed
From: Vegard Nossum <vegard.nossum@oracle.com>
To: Marcelo Ricardo Leitner <marcelo.leitner@gmail.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 14:00:39 +0000	[thread overview]
Message-ID: <57937887.6030204@oracle.com> (raw)
In-Reply-To: <20160723133929.GG9950@localhost.localdomain>

On 07/23/2016 03:39 PM, Marcelo Ricardo Leitner wrote:
> 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?

I think you're right.

> Though yes, if sctp_ht_iter memory is actually re-used without
> initializting between seq_read()s, it triggers the issue you described.

The sctp_ht_iter is allocated in
sctp_assocs_seq_open()/sctp_remaddr_seq_open(), so I assume it's
allocated on open().

> How did you trigger this, reading after an error on the file descriptor?

I was using trinity, so I'm not quite sure a priori, but the problem was
100% reproducible before I applied the patch and seeing that it gets
allocated on open() and is never cleared anywhere else, your suggestion
sounds like the most plausible explanation :-)

How about rewording the first paragraph as:

"""
sctp_transport_seq_start() does not currently clear iter->start_fail on
success, but relies on it being zero when it is allocated (by
seq_open_net()).

This can be a problem in the following sequence:

open() -- allocates iter (and implicitly sets iter->start_fail = 0)
read()
  iter->start() -- fails and sets iter->start_fail = 1
  iter->stop() -- doesn't call sctp_transport_walk_stop() (correct)
read() again
  iter->start() -- succeeds, but doesn't change iter->start_fail
  iter->stop() -- doesn't call sctp_transport_walk_stop() (wrong)
"""

Let me know how that sounds.

Thanks for looking so closely at it!


Vegard

WARNING: multiple messages have this Message-ID (diff)
From: Vegard Nossum <vegard.nossum@oracle.com>
To: Marcelo Ricardo Leitner <marcelo.leitner@gmail.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 16:00:39 +0200	[thread overview]
Message-ID: <57937887.6030204@oracle.com> (raw)
In-Reply-To: <20160723133929.GG9950@localhost.localdomain>

On 07/23/2016 03:39 PM, Marcelo Ricardo Leitner wrote:
> 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?

I think you're right.

> Though yes, if sctp_ht_iter memory is actually re-used without
> initializting between seq_read()s, it triggers the issue you described.

The sctp_ht_iter is allocated in
sctp_assocs_seq_open()/sctp_remaddr_seq_open(), so I assume it's
allocated on open().

> How did you trigger this, reading after an error on the file descriptor?

I was using trinity, so I'm not quite sure a priori, but the problem was
100% reproducible before I applied the patch and seeing that it gets
allocated on open() and is never cleared anywhere else, your suggestion
sounds like the most plausible explanation :-)

How about rewording the first paragraph as:

"""
sctp_transport_seq_start() does not currently clear iter->start_fail on
success, but relies on it being zero when it is allocated (by
seq_open_net()).

This can be a problem in the following sequence:

open() -- allocates iter (and implicitly sets iter->start_fail = 0)
read()
  iter->start() -- fails and sets iter->start_fail = 1
  iter->stop() -- doesn't call sctp_transport_walk_stop() (correct)
read() again
  iter->start() -- succeeds, but doesn't change iter->start_fail
  iter->stop() -- doesn't call sctp_transport_walk_stop() (wrong)
"""

Let me know how that sounds.

Thanks for looking so closely at it!


Vegard

  reply	other threads:[~2016-07-23 14:00 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
2016-07-23 13:39   ` Marcelo Ricardo Leitner
2016-07-23 14:00   ` Vegard Nossum [this message]
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=57937887.6030204@oracle.com \
    --to=vegard.nossum@oracle.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=marcelo.leitner@gmail.com \
    --cc=netdev@vger.kernel.org \
    --cc=nhorman@tuxdriver.com \
    --cc=stable@vger.kernel.org \
    --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.