提交 d671df2d 编写于 作者: M Marco Elver 提交者: Jialin Zhang

net: switch to storing KCOV handle directly in sk_buff

stable inclusion
from stable-v5.10.163
commit 67349025f00d0749e36386cfcfc32c2887f47fdb
category: bugfix
bugzilla: https://gitee.com/src-openeuler/kernel/issues/I6D0MR
CVE: NA

Reference: https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/commit/?id=67349025f00d0749e36386cfcfc32c2887f47fdb

--------------------------------

[ Upstream commit fa69ee5a ]

It turns out that usage of skb extensions can cause memory leaks. Ido
Schimmel reported: "[...] there are instances that blindly overwrite
'skb->extensions' by invoking skb_copy_header() after __alloc_skb()."

Therefore, give up on using skb extensions for KCOV handle, and instead
directly store kcov_handle in sk_buff.

Fixes: 6370cc3b ("net: add kcov handle to skb extensions")
Fixes: 85ce50d3 ("net: kcov: don't select SKB_EXTENSIONS when there is no NET")
Fixes: 97f53a08 ("net: linux/skbuff.h: combine SKB_EXTENSIONS + KCOV handling")
Link: https://lore.kernel.org/linux-wireless/20201121160941.GA485907@shredder.lan/Reported-by: NIdo Schimmel <idosch@idosch.org>
Signed-off-by: NMarco Elver <elver@google.com>
Link: https://lore.kernel.org/r/20201125224840.2014773-1-elver@google.comSigned-off-by: NJakub Kicinski <kuba@kernel.org>
Stable-dep-of: db0b124f ("igc: Enhance Qbv scheduling by using first flag bit")
Signed-off-by: NSasha Levin <sashal@kernel.org>

Conflicts:
	include/linux/skbuff.h
Signed-off-by: NZhengchao Shao <shaozhengchao@huawei.com>
Reviewed-by: NLiu Jian <liujian56@huawei.com>
Signed-off-by: NJialin Zhang <zhangjialin11@huawei.com>
上级 17a26a1d
......@@ -706,6 +706,7 @@ typedef unsigned char *sk_buff_data_t;
* @transport_header: Transport layer header
* @network_header: Network layer header
* @mac_header: Link layer header
* @kcov_handle: KCOV remote handle for remote coverage collection
* @scm_io_uring: SKB holds io_uring registered files
* @tail: Tail pointer
* @end: End pointer
......@@ -913,6 +914,10 @@ struct sk_buff {
__u16 network_header;
__u16 mac_header;
#ifdef CONFIG_KCOV
u64 kcov_handle;
#endif
/* private: */
__u32 headers_end[0];
/* public: */
......@@ -4212,9 +4217,6 @@ enum skb_ext_id {
#endif
#if IS_ENABLED(CONFIG_MPTCP)
SKB_EXT_MPTCP,
#endif
#if IS_ENABLED(CONFIG_KCOV)
SKB_EXT_KCOV_HANDLE,
#endif
SKB_EXT_NUM, /* must be last */
};
......@@ -4670,35 +4672,22 @@ static inline void skb_reset_redirect(struct sk_buff *skb)
#endif
}
#if IS_ENABLED(CONFIG_KCOV) && IS_ENABLED(CONFIG_SKB_EXTENSIONS)
static inline void skb_set_kcov_handle(struct sk_buff *skb,
const u64 kcov_handle)
{
/* Do not allocate skb extensions only to set kcov_handle to zero
* (as it is zero by default). However, if the extensions are
* already allocated, update kcov_handle anyway since
* skb_set_kcov_handle can be called to zero a previously set
* value.
*/
if (skb_has_extensions(skb) || kcov_handle) {
u64 *kcov_handle_ptr = skb_ext_add(skb, SKB_EXT_KCOV_HANDLE);
if (kcov_handle_ptr)
*kcov_handle_ptr = kcov_handle;
}
#ifdef CONFIG_KCOV
skb->kcov_handle = kcov_handle;
#endif
}
static inline u64 skb_get_kcov_handle(struct sk_buff *skb)
{
u64 *kcov_handle = skb_ext_find(skb, SKB_EXT_KCOV_HANDLE);
return kcov_handle ? *kcov_handle : 0;
}
#ifdef CONFIG_KCOV
return skb->kcov_handle;
#else
static inline void skb_set_kcov_handle(struct sk_buff *skb,
const u64 kcov_handle) { }
static inline u64 skb_get_kcov_handle(struct sk_buff *skb) { return 0; }
#endif /* CONFIG_KCOV && CONFIG_SKB_EXTENSIONS */
return 0;
#endif
}
static inline bool skb_csum_is_sctp(struct sk_buff *skb)
{
......
......@@ -1945,7 +1945,6 @@ config KCOV
depends on CC_HAS_SANCOV_TRACE_PC || GCC_PLUGINS
select DEBUG_FS
select GCC_PLUGIN_SANCOV if !CC_HAS_SANCOV_TRACE_PC
select SKB_EXTENSIONS if NET
help
KCOV exposes kernel code coverage information in a form suitable
for coverage-guided fuzzing (randomized testing).
......
......@@ -4262,9 +4262,6 @@ static const u8 skb_ext_type_len[] = {
#if IS_ENABLED(CONFIG_MPTCP)
[SKB_EXT_MPTCP] = SKB_EXT_CHUNKSIZEOF(struct mptcp_ext),
#endif
#if IS_ENABLED(CONFIG_KCOV)
[SKB_EXT_KCOV_HANDLE] = SKB_EXT_CHUNKSIZEOF(u64),
#endif
};
static __always_inline unsigned int skb_ext_total_length(void)
......@@ -4281,9 +4278,6 @@ static __always_inline unsigned int skb_ext_total_length(void)
#endif
#if IS_ENABLED(CONFIG_MPTCP)
skb_ext_type_len[SKB_EXT_MPTCP] +
#endif
#if IS_ENABLED(CONFIG_KCOV)
skb_ext_type_len[SKB_EXT_KCOV_HANDLE] +
#endif
0;
}
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册