• Carl Huang's avatar
    net: qrtr: fix len of skb_put_padto in qrtr_node_enqueue · ce57785b
    Carl Huang authored
    The len used for skb_put_padto is wrong, it need to add len of hdr.
    
    In qrtr_node_enqueue, local variable size_t len is assign with
    skb->len, then skb_push(skb, sizeof(*hdr)) will add skb->len with
    sizeof(*hdr), so local variable size_t len is not same with skb->len
    after skb_push(skb, sizeof(*hdr)).
    
    Then the purpose of skb_put_padto(skb, ALIGN(len, 4)) is to add add
    pad to the end of the skb's data if skb->len is not aligned to 4, but
    unfortunately it use len instead of skb->len, at this line, skb->len
    is 32 bytes(sizeof(*hdr)) more than len, for example, len is 3 bytes,
    then skb->len is 35 bytes(3 + 32), and ALIGN(len, 4) is 4 bytes, so
    __skb_put_padto will do nothing after check size(35) < len(4), the
    correct value should be 36(sizeof(*hdr) + ALIGN(len, 4) = 32 + 4),
    then __skb_put_padto will pass check size(35) < len(36) and add 1 byte
    to the end of skb's data, then logic is correct.
    
    function of skb_push:
    void *skb_push(struct sk_buff *skb, unsigned int len)
    {
    	skb->data -= len;
    	skb->len  += len;
    	if (unlikely(skb->data < skb->head))
    		skb_under_panic(skb, len, __builtin_return_address(0));
    	return skb->data;
    }
    
    function of skb_put_padto
    static inline int skb_put_padto(struct sk_buff *skb, unsigned int len)
    {
    	return __skb_put_padto(skb, len, true);
    }
    
    function of __skb_put_padto
    static inline int __skb_put_padto(struct sk_buff *skb, unsigned int len,
    				  bool free_on_error)
    {
    	unsigned int size = skb->len;
    
    	if (unlikely(size < len)) {
    		len -= size;
    		if (__skb_pad(skb, len, free_on_error))
    			return -ENOMEM;
    		__skb_put(skb, len);
    	}
    	return 0;
    }
    Signed-off-by: default avatarCarl Huang <cjhuang@codeaurora.org>
    Signed-off-by: default avatarWen Gong <wgong@codeaurora.org>
    Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
    ce57785b
qrtr.c 24.7 KB