• Russell King's avatar
    netfilter: ipset: fix unaligned atomic access · 71502846
    Russell King authored
    When using ip_set with counters and comment, traffic causes the kernel
    to panic on 32-bit ARM:
    
    Alignment trap: not handling instruction e1b82f9f at [<bf01b0dc>]
    Unhandled fault: alignment exception (0x221) at 0xea08133c
    PC is at ip_set_match_extensions+0xe0/0x224 [ip_set]
    
    The problem occurs when we try to update the 64-bit counters - the
    faulting address above is not 64-bit aligned.  The problem occurs
    due to the way elements are allocated, for example:
    
    	set->dsize = ip_set_elem_len(set, tb, 0, 0);
    	map = ip_set_alloc(sizeof(*map) + elements * set->dsize);
    
    If the element has a requirement for a member to be 64-bit aligned,
    and set->dsize is not a multiple of 8, but is a multiple of four,
    then every odd numbered elements will be misaligned - and hitting
    an atomic64_add() on that element will cause the kernel to panic.
    
    ip_set_elem_len() must return a size that is rounded to the maximum
    alignment of any extension field stored in the element.  This change
    ensures that is the case.
    
    Fixes: 95ad1f4a ("netfilter: ipset: Fix extension alignment")
    Signed-off-by: default avatarRussell King <rmk+kernel@armlinux.org.uk>
    Acked-by: default avatarJozsef Kadlecsik <kadlec@netfilter.org>
    Signed-off-by: default avatarPablo Neira Ayuso <pablo@netfilter.org>
    71502846
ip_set_core.c 62.9 KB