• Thomas Graf's avatar
    netlink: Don't reorder loads/stores before marking mmap netlink frame as available · d7ab02d6
    Thomas Graf authored
    [ Upstream commit a18e6a18 ]
    
    Each mmap Netlink frame contains a status field which indicates
    whether the frame is unused, reserved, contains data or needs to
    be skipped. Both loads and stores may not be reordeded and must
    complete before the status field is changed and another CPU might
    pick up the frame for use. Use an smp_mb() to cover needs of both
    types of callers to netlink_set_status(), callers which have been
    reading data frame from the frame, and callers which have been
    filling or releasing and thus writing to the frame.
    
    - Example code path requiring a smp_rmb():
      memcpy(skb->data, (void *)hdr + NL_MMAP_HDRLEN, hdr->nm_len);
      netlink_set_status(hdr, NL_MMAP_STATUS_UNUSED);
    
    - Example code path requiring a smp_wmb():
      hdr->nm_uid	= from_kuid(sk_user_ns(sk), NETLINK_CB(skb).creds.uid);
      hdr->nm_gid	= from_kgid(sk_user_ns(sk), NETLINK_CB(skb).creds.gid);
      netlink_frame_flush_dcache(hdr);
      netlink_set_status(hdr, NL_MMAP_STATUS_VALID);
    
    Fixes: f9c228 ("netlink: implement memory mapped recvmsg()")
    Reported-by: default avatarEric Dumazet <eric.dumazet@gmail.com>
    Signed-off-by: default avatarThomas Graf <tgraf@suug.ch>
    Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
    Signed-off-by: default avatarJiri Slaby <jslaby@suse.cz>
    d7ab02d6
af_netlink.c 72.3 KB