From: pidoux <bpidoux@free.fr>
To: David Miller <davem@davemloft.net>
Cc: netdev@vger.kernel.org
Subject: Re: [PATCH] negative dev use in /proc/net/rose_neigh
Date: Tue, 21 Oct 2008 16:14:27 +0200 [thread overview]
Message-ID: <48FDE3C3.1050504@free.fr> (raw)
In-Reply-To: <20081013.003009.241543234.davem@davemloft.net>
David,
I tried the patch you proposed.
I agree that it makes sense, however it does not prevent rose->neighbour->use to become negative as displayed in
/proc/net/rose_neigh use field value.
I already looked at all of the pieces of code that do "rose->neighbour->use--;"
The only place that caused use to underflow (negative) is actually inside rose_kill_by_neigh().
This is why I had put a test and a warning there.
I think that inside of sk_for_each() loop in rose_kill_by_neigh() when rose->neighbour->use-- becomes = 0 then
rose->neighbour should be NULLed and in that case only.
However it seems that rose->neighbour is not actually NULLed for in that case the comparison would not be true anymore
and the decrement would not occur.
I will soon report the printk output of rose->neighbour->use-- inside of the loop to illustrate what happens here.
Bernard Pidoux
David Miller wrote:
> From: Bernard Pidoux <bpidoux@free.fr>
> Date: Tue, 30 Sep 2008 23:44:55 +0200
>
>> I suspect that the bug was unravelled when we added more than one
>> neighbour per route. The protocole accepts three, but this was not
>> much used during the early days since the density of radio stations
>> on the network was not big (only one node station per destination
>> address usually). The network is now denser with Internet links.
>>
>> However, I don't understand why the test
>>
>> if (rose->neighbour == neigh)
>>
>> does not work, for
>> rose->neighbour = NULL;
>> should prevent next comparison to be valid and thus instruction
>> rose->neighbour->use--; not executed.
>>
>> I have seen that a problem with sk_for_each() macro was identified a
>> while ago into ax25 code. The problem here could be similar ?
>
> I took a look at this some more.
>
> That neighbour case loop you mention does set ->neighbour to NULL.
>
> But other paths do not. Just look for all of the pieces of code
> that do "rose->neighbour->use--;" and you'll find a few that do not
> NULL it out.
>
> One such example is rose_kill_by_device().
>
> That would cause a problem because, while rose_disconnect() marks
> the socket DEAD, it doesn't actually remove it from "rose_list".
> That happens later when the user actually closes the socket or
> some other similar event occurs.
>
> Therefore if rose_kill_by_neigh() happens next, the ->neighbour could
> match and we'll decrement again.
>
> But I have no idea how safe it is to NULL out this ->neighbour
> unconditionally. Lots of code seems to deref the thing unconditionally.
> For example the ROSE_STATE_2 handling in rose_release().
>
> I guess since rose_disconnect() sets sk->sk_state to TCP_CLOSE, we'll
> be OK here.
>
> Can you try this patch?
>
> diff --git a/net/rose/af_rose.c b/net/rose/af_rose.c
> index a7f1ce1..41dd630 100644
> --- a/net/rose/af_rose.c
> +++ b/net/rose/af_rose.c
> @@ -197,6 +197,7 @@ static void rose_kill_by_device(struct net_device *dev)
> if (rose->device == dev) {
> rose_disconnect(s, ENETUNREACH, ROSE_OUT_OF_ORDER, 0);
> rose->neighbour->use--;
> + rose->neighbour = NULL;
> rose->device = NULL;
> }
> }
> @@ -625,6 +626,7 @@ static int rose_release(struct socket *sock)
>
> case ROSE_STATE_2:
> rose->neighbour->use--;
> + rose->neighbour = NULL;
> release_sock(sk);
> rose_disconnect(sk, 0, -1, -1);
> lock_sock(sk);
>
>
prev parent reply other threads:[~2008-10-21 14:14 UTC|newest]
Thread overview: 5+ messages / expand[flat|nested] mbox.gz Atom feed top
2008-09-28 19:56 [PATCH] negative dev use in /proc/net/rose_neigh Bernard Pidoux
2008-09-30 14:32 ` David Miller
2008-09-30 21:44 ` Bernard Pidoux
2008-10-13 7:30 ` David Miller
2008-10-21 14:14 ` pidoux [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=48FDE3C3.1050504@free.fr \
--to=bpidoux@free.fr \
--cc=davem@davemloft.net \
--cc=netdev@vger.kernel.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.