Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
ip_gre: set dev->hard_header_len and dev->needed_headroom properly
GRE tunnel has its own header_ops, ipgre_header_ops, and sets it conditionally. When it is set, it assumes the outer IP header is already created before ipgre_xmit(). This is not true when we send packets through a raw packet socket, where L2 headers are supposed to be constructed by user. Packet socket calls dev_validate_header() to validate the header. But GRE tunnel does not set dev->hard_header_len, so that check can be simply bypassed, therefore uninit memory could be passed down to ipgre_xmit(). Similar for dev->needed_headroom. dev->hard_header_len is supposed to be the length of the header created by dev->header_ops->create(), so it should be used whenever header_ops is set, and dev->needed_headroom should be used when it is not set. Reported-and-tested-by: [email protected] Cc: William Tu <[email protected]> Acked-by: Willem de Bruijn <[email protected]> Signed-off-by: Cong Wang <[email protected]> Acked-by: Xie He <[email protected]> Signed-off-by: Jakub Kicinski <[email protected]>
- Loading branch information