• Feng Liu's avatar
    virtio_net: Introduce skb_vnet_common_hdr to avoid typecasting · dae64749
    Feng Liu authored
    The virtio_net driver currently deals with different versions and types
    of virtio net headers, such as virtio_net_hdr_mrg_rxbuf,
    virtio_net_hdr_v1_hash, etc. Due to these variations, the code relies
    on multiple type casts to convert memory between different structures,
    potentially leading to bugs when there are changes in these structures.
    
    Introduces the "struct skb_vnet_common_hdr" as a unifying header
    structure using a union. With this approach, various virtio net header
    structures can be converted by accessing different members of this
    structure, thus eliminating the need for type casting and reducing the
    risk of potential bugs.
    
    For example following code:
    static struct sk_buff *page_to_skb(struct virtnet_info *vi,
    		struct receive_queue *rq,
    		struct page *page, unsigned int offset,
    		unsigned int len, unsigned int truesize,
    		unsigned int headroom)
    {
    [...]
    	struct virtio_net_hdr_mrg_rxbuf *hdr;
    [...]
    	hdr_len = vi->hdr_len;
    [...]
    ok:
    	hdr = skb_vnet_hdr(skb);
    	memcpy(hdr, hdr_p, hdr_len);
    [...]
    }
    
    When VIRTIO_NET_F_HASH_REPORT feature is enabled, hdr_len = 20
    But the sizeof(*hdr) is 12,
    memcpy(hdr, hdr_p, hdr_len); will copy 20 bytes to the hdr,
    which make a potential risk of bug. And this risk can be avoided by
    introducing struct skb_vnet_common_hdr.
    
    Change log
    v1->v2
    feedback from Willem de Bruijn <willemdebruijn.kernel@gmail.com>
    feedback from Simon Horman <horms@kernel.org>
    1. change to use net-next tree.
    2. move skb_vnet_common_hdr inside kernel file instead of the UAPI header.
    
    v2->v3
    feedback from Willem de Bruijn <willemdebruijn.kernel@gmail.com>
    1. fix typo in commit message.
    2. add original struct virtio_net_hdr into union
    3. remove virtio_net_hdr_mrg_rxbuf variable in receive_buf;
    Signed-off-by: default avatarFeng Liu <feliu@nvidia.com>
    Reviewed-by: default avatarJiri Pirko <jiri@nvidia.com>
    Reviewed-by: default avatarWillem de Bruijn <willemb@google.com>
    Acked-by: default avatarJason Wang <jasowang@redhat.com>
    Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
    dae64749
virtio_net.c 120 KB