|
Message-ID: <20161220131345.GM3124@twins.programming.kicks-ass.net> Date: Tue, 20 Dec 2016 14:13:45 +0100 From: Peter Zijlstra <peterz@...radead.org> To: Liljestrand Hans <ishkamiel@...il.com> Cc: "Reshetova, Elena" <elena.reshetova@...el.com>, "kernel-hardening@...ts.openwall.com" <kernel-hardening@...ts.openwall.com>, Greg KH <gregkh@...uxfoundation.org>, Kees Cook <keescook@...omium.org>, "will.deacon@....com" <will.deacon@....com>, Boqun Feng <boqun.feng@...il.com>, David Windsor <dwindsor@...il.com>, "aik@...abs.ru" <aik@...abs.ru>, "david@...son.dropbear.id.au" <david@...son.dropbear.id.au> Subject: Re: Conversion from atomic_t to refcount_t: summary of issues On Tue, Dec 20, 2016 at 12:55:02PM +0200, Liljestrand Hans wrote: > For reference, I've listed here the places that were causing "increment > on 0" WARNs on my previous boot (temporarily allowed inc on 0 to make > boot possible). These seem to be mostly related to resource reuse, but > we haven't yet to looked in detail on how to deal with them. > > fs/ext4/mballoc.c:3399 ext4_mb_use_preallocated > Seems to have separate tracking of destruction This one seems particularly daft, since afaict all pa_count usage is under pa_lock. No need for it to be atomic. Also, that code is weird, it has separate pa_free and pa_deleted state. This should definitely not be converted to refcount_t until its sanitized. > net/ipv4/fib_semantics.c:994 fib_create_info This one I'm not sure how its not broken. It does something like: ofi = fib_find_info(fi); if (ofi) { // use ofi, free fi } spin_lock_hb(); atomic_inc(&fi->fib_clntref); // insert fi spin_unlock_hb(); If that races against itself, both instances can fail to find an existing matching fi, and both will insert fi, resulting in a duplicate fi. Also, note that at the point of atomic_inc(), fi isn't in fact published and therefore this need not be an atomic operation. I could of course miss something subtle, since I only read part of this code. In any case, even if that were somehow incorrect, I think you can init fib_clntref with 1 and make it work with that. > net/ipv4/devinet.c:233 inetdev_init This seems to use atomic_inc before the object is published, and could therefore simply use atomic_set(). > net/ipv4/tcp_ipv4.c:1793 inet_sk_rx_dst_set That needs more context to be evaluated. Also seems very dodgy code in any case. We need the caller of this function that calls it on 0. > net/ipv4/route.c:2153: __ip_route_output_key_hash need more context, there's not in fact an atomic_ in that function, and its a giant function. > net/ipv6/ip6_fib.c:949 fib6_add Can't make sense of this :/ Didn't look at the rest, but going by the above blindly converting to refcount_t without prior cleanups isn't a good idea.
Powered by blists - more mailing lists
Confused about mailing lists and their use? Read about mailing lists on Wikipedia and check out these guidelines on proper formatting of your messages.