• Lukas Bulwahn's avatar
    net/ipv6: propagate user pointer annotation · 9e39394f
    Lukas Bulwahn authored
    For IPV6_2292PKTOPTIONS, do_ipv6_getsockopt() stores the user pointer
    optval in the msg_control field of the msghdr.
    
    Hence, sparse rightfully warns at ./net/ipv6/ipv6_sockglue.c:1151:33:
    
      warning: incorrect type in assignment (different address spaces)
          expected void *msg_control
          got char [noderef] __user *optval
    
    Since commit 1f466e1f ("net: cleanly handle kernel vs user buffers for
    ->msg_control"), user pointers shall be stored in the msg_control_user
    field, and kernel pointers in the msg_control field. This allows to
    propagate __user annotations nicely through this struct.
    
    Store optval in msg_control_user to properly record and propagate the
    memory space annotation of this pointer.
    
    Note that msg_control_is_user is set to true, so the key invariant, i.e.,
    use msg_control_user if and only if msg_control_is_user is true, holds.
    
    The msghdr is further used in the six alternative put_cmsg() calls, with
    msg_control_is_user being true, put_cmsg() picks msg_control_user
    preserving the __user annotation and passes that properly to
    copy_to_user().
    
    No functional change. No change in object code.
    Signed-off-by: default avatarLukas Bulwahn <lukas.bulwahn@gmail.com>
    Reviewed-by: default avatarChristoph Hellwig <hch@lst.de>
    Link: https://lore.kernel.org/r/20201127093421.21673-1-lukas.bulwahn@gmail.comSigned-off-by: default avatarJakub Kicinski <kuba@kernel.org>
    9e39394f
ipv6_sockglue.c 31.9 KB