mirror of https://github.com/torvalds/linux.git
When a slab cache uses SLAB_DESTROY_BY_RCU, we must be careful when allocating objects, since slab allocator could give a freed object still used by lockless readers. In particular, nf_conntrack RCU lookups rely on ct->tuplehash[xxx].hnnode.next being always valid (ie containing a valid 'nulls' value, or a valid pointer to next object in hash chain.) kmem_cache_zalloc() setups object with NULL values, but a NULL value is not valid for ct->tuplehash[xxx].hnnode.next. Fix is to call kmem_cache_alloc() and do the zeroing ourself. As spotted by Patrick, we also need to make sure lookup keys are committed to memory before setting refcount to 1, or a lockless reader could get a reference on the old version of the object. Its key re-check could then pass the barrier. Signed-off-by: Eric Dumazet <eric.dumazet@gmail.com> Signed-off-by: Patrick McHardy <kaber@trash.net> |
||
|---|---|---|
| .. | ||
| ipvs | ||
| Kconfig | ||
| Makefile | ||
| core.c | ||
| nf_conntrack_acct.c | ||
| nf_conntrack_amanda.c | ||
| nf_conntrack_core.c | ||
| nf_conntrack_ecache.c | ||
| nf_conntrack_expect.c | ||
| nf_conntrack_extend.c | ||
| nf_conntrack_ftp.c | ||
| nf_conntrack_h323_asn1.c | ||
| nf_conntrack_h323_main.c | ||
| nf_conntrack_h323_types.c | ||
| nf_conntrack_helper.c | ||
| nf_conntrack_irc.c | ||
| nf_conntrack_l3proto_generic.c | ||
| nf_conntrack_netbios_ns.c | ||
| nf_conntrack_netlink.c | ||
| nf_conntrack_pptp.c | ||
| nf_conntrack_proto.c | ||
| nf_conntrack_proto_dccp.c | ||
| nf_conntrack_proto_generic.c | ||
| nf_conntrack_proto_gre.c | ||
| nf_conntrack_proto_sctp.c | ||
| nf_conntrack_proto_tcp.c | ||
| nf_conntrack_proto_udp.c | ||
| nf_conntrack_proto_udplite.c | ||
| nf_conntrack_sane.c | ||
| nf_conntrack_sip.c | ||
| nf_conntrack_standalone.c | ||
| nf_conntrack_tftp.c | ||
| nf_internals.h | ||
| nf_log.c | ||
| nf_queue.c | ||
| nf_sockopt.c | ||
| nf_tproxy_core.c | ||
| nfnetlink.c | ||
| nfnetlink_log.c | ||
| nfnetlink_queue.c | ||
| x_tables.c | ||
| xt_CLASSIFY.c | ||
| xt_CONNMARK.c | ||
| xt_CONNSECMARK.c | ||
| xt_DSCP.c | ||
| xt_HL.c | ||
| xt_LED.c | ||
| xt_MARK.c | ||
| xt_NFLOG.c | ||
| xt_NFQUEUE.c | ||
| xt_NOTRACK.c | ||
| xt_RATEEST.c | ||
| xt_SECMARK.c | ||
| xt_TCPMSS.c | ||
| xt_TCPOPTSTRIP.c | ||
| xt_TPROXY.c | ||
| xt_TRACE.c | ||
| xt_cluster.c | ||
| xt_comment.c | ||
| xt_connbytes.c | ||
| xt_connlimit.c | ||
| xt_connmark.c | ||
| xt_conntrack.c | ||
| xt_dccp.c | ||
| xt_dscp.c | ||
| xt_esp.c | ||
| xt_hashlimit.c | ||
| xt_helper.c | ||
| xt_hl.c | ||
| xt_iprange.c | ||
| xt_length.c | ||
| xt_limit.c | ||
| xt_mac.c | ||
| xt_mark.c | ||
| xt_multiport.c | ||
| xt_osf.c | ||
| xt_owner.c | ||
| xt_physdev.c | ||
| xt_pkttype.c | ||
| xt_policy.c | ||
| xt_quota.c | ||
| xt_rateest.c | ||
| xt_realm.c | ||
| xt_recent.c | ||
| xt_sctp.c | ||
| xt_socket.c | ||
| xt_state.c | ||
| xt_statistic.c | ||
| xt_string.c | ||
| xt_tcpmss.c | ||
| xt_tcpudp.c | ||
| xt_time.c | ||
| xt_u32.c | ||