Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

Merge branch 'debug-net'

Eric Dumazet says:

====================
net: CONFIG_DEBUG_NET and friends

This patch series is inspired by some syzbot reports
hinting that skb transport_header might be not set
in places we expect it being set.

Add a new CONFIG_DEBUG_NET option
and DEBUG_NET_WARN_ON_ONCE() helper, so that we can start
adding more sanity checks in the future.

Replace two BUG() in skb_checksum_help()
with less risky code.

v2: make first patch compile on more arches/compilers
add the 5th patch to add more debugging in skb_checksum_help()
====================

Signed-off-by: David S. Miller <davem@davemloft.net>

+176 -143
+1 -140
include/linux/netdevice.h
··· 50 50 #include <linux/hashtable.h> 51 51 #include <linux/rbtree.h> 52 52 #include <net/net_trackers.h> 53 + #include <net/net_debug.h> 53 54 54 55 struct netpoll_info; 55 56 struct device; ··· 5072 5071 return " (unknown)"; 5073 5072 } 5074 5073 5075 - __printf(3, 4) __cold 5076 - void netdev_printk(const char *level, const struct net_device *dev, 5077 - const char *format, ...); 5078 - __printf(2, 3) __cold 5079 - void netdev_emerg(const struct net_device *dev, const char *format, ...); 5080 - __printf(2, 3) __cold 5081 - void netdev_alert(const struct net_device *dev, const char *format, ...); 5082 - __printf(2, 3) __cold 5083 - void netdev_crit(const struct net_device *dev, const char *format, ...); 5084 - __printf(2, 3) __cold 5085 - void netdev_err(const struct net_device *dev, const char *format, ...); 5086 - __printf(2, 3) __cold 5087 - void netdev_warn(const struct net_device *dev, const char *format, ...); 5088 - __printf(2, 3) __cold 5089 - void netdev_notice(const struct net_device *dev, const char *format, ...); 5090 - __printf(2, 3) __cold 5091 - void netdev_info(const struct net_device *dev, const char *format, ...); 5092 - 5093 - #define netdev_level_once(level, dev, fmt, ...) \ 5094 - do { \ 5095 - static bool __section(".data.once") __print_once; \ 5096 - \ 5097 - if (!__print_once) { \ 5098 - __print_once = true; \ 5099 - netdev_printk(level, dev, fmt, ##__VA_ARGS__); \ 5100 - } \ 5101 - } while (0) 5102 - 5103 - #define netdev_emerg_once(dev, fmt, ...) \ 5104 - netdev_level_once(KERN_EMERG, dev, fmt, ##__VA_ARGS__) 5105 - #define netdev_alert_once(dev, fmt, ...) \ 5106 - netdev_level_once(KERN_ALERT, dev, fmt, ##__VA_ARGS__) 5107 - #define netdev_crit_once(dev, fmt, ...) \ 5108 - netdev_level_once(KERN_CRIT, dev, fmt, ##__VA_ARGS__) 5109 - #define netdev_err_once(dev, fmt, ...) \ 5110 - netdev_level_once(KERN_ERR, dev, fmt, ##__VA_ARGS__) 5111 - #define netdev_warn_once(dev, fmt, ...) \ 5112 - netdev_level_once(KERN_WARNING, dev, fmt, ##__VA_ARGS__) 5113 - #define netdev_notice_once(dev, fmt, ...) \ 5114 - netdev_level_once(KERN_NOTICE, dev, fmt, ##__VA_ARGS__) 5115 - #define netdev_info_once(dev, fmt, ...) \ 5116 - netdev_level_once(KERN_INFO, dev, fmt, ##__VA_ARGS__) 5117 - 5118 5074 #define MODULE_ALIAS_NETDEV(device) \ 5119 5075 MODULE_ALIAS("netdev-" device) 5120 - 5121 - #if defined(CONFIG_DYNAMIC_DEBUG) || \ 5122 - (defined(CONFIG_DYNAMIC_DEBUG_CORE) && defined(DYNAMIC_DEBUG_MODULE)) 5123 - #define netdev_dbg(__dev, format, args...) \ 5124 - do { \ 5125 - dynamic_netdev_dbg(__dev, format, ##args); \ 5126 - } while (0) 5127 - #elif defined(DEBUG) 5128 - #define netdev_dbg(__dev, format, args...) \ 5129 - netdev_printk(KERN_DEBUG, __dev, format, ##args) 5130 - #else 5131 - #define netdev_dbg(__dev, format, args...) \ 5132 - ({ \ 5133 - if (0) \ 5134 - netdev_printk(KERN_DEBUG, __dev, format, ##args); \ 5135 - }) 5136 - #endif 5137 - 5138 - #if defined(VERBOSE_DEBUG) 5139 - #define netdev_vdbg netdev_dbg 5140 - #else 5141 - 5142 - #define netdev_vdbg(dev, format, args...) \ 5143 - ({ \ 5144 - if (0) \ 5145 - netdev_printk(KERN_DEBUG, dev, format, ##args); \ 5146 - 0; \ 5147 - }) 5148 - #endif 5149 5076 5150 5077 /* 5151 5078 * netdev_WARN() acts like dev_printk(), but with the key difference ··· 5087 5158 #define netdev_WARN_ONCE(dev, format, args...) \ 5088 5159 WARN_ONCE(1, "netdevice: %s%s: " format, netdev_name(dev), \ 5089 5160 netdev_reg_state(dev), ##args) 5090 - 5091 - /* netif printk helpers, similar to netdev_printk */ 5092 - 5093 - #define netif_printk(priv, type, level, dev, fmt, args...) \ 5094 - do { \ 5095 - if (netif_msg_##type(priv)) \ 5096 - netdev_printk(level, (dev), fmt, ##args); \ 5097 - } while (0) 5098 - 5099 - #define netif_level(level, priv, type, dev, fmt, args...) \ 5100 - do { \ 5101 - if (netif_msg_##type(priv)) \ 5102 - netdev_##level(dev, fmt, ##args); \ 5103 - } while (0) 5104 - 5105 - #define netif_emerg(priv, type, dev, fmt, args...) \ 5106 - netif_level(emerg, priv, type, dev, fmt, ##args) 5107 - #define netif_alert(priv, type, dev, fmt, args...) \ 5108 - netif_level(alert, priv, type, dev, fmt, ##args) 5109 - #define netif_crit(priv, type, dev, fmt, args...) \ 5110 - netif_level(crit, priv, type, dev, fmt, ##args) 5111 - #define netif_err(priv, type, dev, fmt, args...) \ 5112 - netif_level(err, priv, type, dev, fmt, ##args) 5113 - #define netif_warn(priv, type, dev, fmt, args...) \ 5114 - netif_level(warn, priv, type, dev, fmt, ##args) 5115 - #define netif_notice(priv, type, dev, fmt, args...) \ 5116 - netif_level(notice, priv, type, dev, fmt, ##args) 5117 - #define netif_info(priv, type, dev, fmt, args...) \ 5118 - netif_level(info, priv, type, dev, fmt, ##args) 5119 - 5120 - #if defined(CONFIG_DYNAMIC_DEBUG) || \ 5121 - (defined(CONFIG_DYNAMIC_DEBUG_CORE) && defined(DYNAMIC_DEBUG_MODULE)) 5122 - #define netif_dbg(priv, type, netdev, format, args...) \ 5123 - do { \ 5124 - if (netif_msg_##type(priv)) \ 5125 - dynamic_netdev_dbg(netdev, format, ##args); \ 5126 - } while (0) 5127 - #elif defined(DEBUG) 5128 - #define netif_dbg(priv, type, dev, format, args...) \ 5129 - netif_printk(priv, type, KERN_DEBUG, dev, format, ##args) 5130 - #else 5131 - #define netif_dbg(priv, type, dev, format, args...) \ 5132 - ({ \ 5133 - if (0) \ 5134 - netif_printk(priv, type, KERN_DEBUG, dev, format, ##args); \ 5135 - 0; \ 5136 - }) 5137 - #endif 5138 - 5139 - /* if @cond then downgrade to debug, else print at @level */ 5140 - #define netif_cond_dbg(priv, type, netdev, cond, level, fmt, args...) \ 5141 - do { \ 5142 - if (cond) \ 5143 - netif_dbg(priv, type, netdev, fmt, ##args); \ 5144 - else \ 5145 - netif_ ## level(priv, type, netdev, fmt, ##args); \ 5146 - } while (0) 5147 - 5148 - #if defined(VERBOSE_DEBUG) 5149 - #define netif_vdbg netif_dbg 5150 - #else 5151 - #define netif_vdbg(priv, type, dev, format, args...) \ 5152 - ({ \ 5153 - if (0) \ 5154 - netif_printk(priv, type, KERN_DEBUG, dev, format, ##args); \ 5155 - 0; \ 5156 - }) 5157 - #endif 5158 5161 5159 5162 /* 5160 5163 * The list of packet types we will receive (as opposed to discard)
+2
include/linux/skbuff.h
··· 42 42 #if IS_ENABLED(CONFIG_NF_CONNTRACK) 43 43 #include <linux/netfilter/nf_conntrack_common.h> 44 44 #endif 45 + #include <net/net_debug.h> 45 46 46 47 /** 47 48 * DOC: skb checksums ··· 2905 2904 2906 2905 static inline unsigned char *skb_transport_header(const struct sk_buff *skb) 2907 2906 { 2907 + DEBUG_NET_WARN_ON_ONCE(!skb_transport_header_was_set(skb)); 2908 2908 return skb->head + skb->transport_header; 2909 2909 } 2910 2910
+157
include/net/net_debug.h
··· 1 + /* SPDX-License-Identifier: GPL-2.0 */ 2 + #ifndef _LINUX_NET_DEBUG_H 3 + #define _LINUX_NET_DEBUG_H 4 + 5 + #include <linux/bug.h> 6 + #include <linux/kern_levels.h> 7 + 8 + struct net_device; 9 + 10 + __printf(3, 4) __cold 11 + void netdev_printk(const char *level, const struct net_device *dev, 12 + const char *format, ...); 13 + __printf(2, 3) __cold 14 + void netdev_emerg(const struct net_device *dev, const char *format, ...); 15 + __printf(2, 3) __cold 16 + void netdev_alert(const struct net_device *dev, const char *format, ...); 17 + __printf(2, 3) __cold 18 + void netdev_crit(const struct net_device *dev, const char *format, ...); 19 + __printf(2, 3) __cold 20 + void netdev_err(const struct net_device *dev, const char *format, ...); 21 + __printf(2, 3) __cold 22 + void netdev_warn(const struct net_device *dev, const char *format, ...); 23 + __printf(2, 3) __cold 24 + void netdev_notice(const struct net_device *dev, const char *format, ...); 25 + __printf(2, 3) __cold 26 + void netdev_info(const struct net_device *dev, const char *format, ...); 27 + 28 + #define netdev_level_once(level, dev, fmt, ...) \ 29 + do { \ 30 + static bool __section(".data.once") __print_once; \ 31 + \ 32 + if (!__print_once) { \ 33 + __print_once = true; \ 34 + netdev_printk(level, dev, fmt, ##__VA_ARGS__); \ 35 + } \ 36 + } while (0) 37 + 38 + #define netdev_emerg_once(dev, fmt, ...) \ 39 + netdev_level_once(KERN_EMERG, dev, fmt, ##__VA_ARGS__) 40 + #define netdev_alert_once(dev, fmt, ...) \ 41 + netdev_level_once(KERN_ALERT, dev, fmt, ##__VA_ARGS__) 42 + #define netdev_crit_once(dev, fmt, ...) \ 43 + netdev_level_once(KERN_CRIT, dev, fmt, ##__VA_ARGS__) 44 + #define netdev_err_once(dev, fmt, ...) \ 45 + netdev_level_once(KERN_ERR, dev, fmt, ##__VA_ARGS__) 46 + #define netdev_warn_once(dev, fmt, ...) \ 47 + netdev_level_once(KERN_WARNING, dev, fmt, ##__VA_ARGS__) 48 + #define netdev_notice_once(dev, fmt, ...) \ 49 + netdev_level_once(KERN_NOTICE, dev, fmt, ##__VA_ARGS__) 50 + #define netdev_info_once(dev, fmt, ...) \ 51 + netdev_level_once(KERN_INFO, dev, fmt, ##__VA_ARGS__) 52 + 53 + #if defined(CONFIG_DYNAMIC_DEBUG) || \ 54 + (defined(CONFIG_DYNAMIC_DEBUG_CORE) && defined(DYNAMIC_DEBUG_MODULE)) 55 + #define netdev_dbg(__dev, format, args...) \ 56 + do { \ 57 + dynamic_netdev_dbg(__dev, format, ##args); \ 58 + } while (0) 59 + #elif defined(DEBUG) 60 + #define netdev_dbg(__dev, format, args...) \ 61 + netdev_printk(KERN_DEBUG, __dev, format, ##args) 62 + #else 63 + #define netdev_dbg(__dev, format, args...) \ 64 + ({ \ 65 + if (0) \ 66 + netdev_printk(KERN_DEBUG, __dev, format, ##args); \ 67 + }) 68 + #endif 69 + 70 + #if defined(VERBOSE_DEBUG) 71 + #define netdev_vdbg netdev_dbg 72 + #else 73 + 74 + #define netdev_vdbg(dev, format, args...) \ 75 + ({ \ 76 + if (0) \ 77 + netdev_printk(KERN_DEBUG, dev, format, ##args); \ 78 + 0; \ 79 + }) 80 + #endif 81 + 82 + /* netif printk helpers, similar to netdev_printk */ 83 + 84 + #define netif_printk(priv, type, level, dev, fmt, args...) \ 85 + do { \ 86 + if (netif_msg_##type(priv)) \ 87 + netdev_printk(level, (dev), fmt, ##args); \ 88 + } while (0) 89 + 90 + #define netif_level(level, priv, type, dev, fmt, args...) \ 91 + do { \ 92 + if (netif_msg_##type(priv)) \ 93 + netdev_##level(dev, fmt, ##args); \ 94 + } while (0) 95 + 96 + #define netif_emerg(priv, type, dev, fmt, args...) \ 97 + netif_level(emerg, priv, type, dev, fmt, ##args) 98 + #define netif_alert(priv, type, dev, fmt, args...) \ 99 + netif_level(alert, priv, type, dev, fmt, ##args) 100 + #define netif_crit(priv, type, dev, fmt, args...) \ 101 + netif_level(crit, priv, type, dev, fmt, ##args) 102 + #define netif_err(priv, type, dev, fmt, args...) \ 103 + netif_level(err, priv, type, dev, fmt, ##args) 104 + #define netif_warn(priv, type, dev, fmt, args...) \ 105 + netif_level(warn, priv, type, dev, fmt, ##args) 106 + #define netif_notice(priv, type, dev, fmt, args...) \ 107 + netif_level(notice, priv, type, dev, fmt, ##args) 108 + #define netif_info(priv, type, dev, fmt, args...) \ 109 + netif_level(info, priv, type, dev, fmt, ##args) 110 + 111 + #if defined(CONFIG_DYNAMIC_DEBUG) || \ 112 + (defined(CONFIG_DYNAMIC_DEBUG_CORE) && defined(DYNAMIC_DEBUG_MODULE)) 113 + #define netif_dbg(priv, type, netdev, format, args...) \ 114 + do { \ 115 + if (netif_msg_##type(priv)) \ 116 + dynamic_netdev_dbg(netdev, format, ##args); \ 117 + } while (0) 118 + #elif defined(DEBUG) 119 + #define netif_dbg(priv, type, dev, format, args...) \ 120 + netif_printk(priv, type, KERN_DEBUG, dev, format, ##args) 121 + #else 122 + #define netif_dbg(priv, type, dev, format, args...) \ 123 + ({ \ 124 + if (0) \ 125 + netif_printk(priv, type, KERN_DEBUG, dev, format, ##args); \ 126 + 0; \ 127 + }) 128 + #endif 129 + 130 + /* if @cond then downgrade to debug, else print at @level */ 131 + #define netif_cond_dbg(priv, type, netdev, cond, level, fmt, args...) \ 132 + do { \ 133 + if (cond) \ 134 + netif_dbg(priv, type, netdev, fmt, ##args); \ 135 + else \ 136 + netif_ ## level(priv, type, netdev, fmt, ##args); \ 137 + } while (0) 138 + 139 + #if defined(VERBOSE_DEBUG) 140 + #define netif_vdbg netif_dbg 141 + #else 142 + #define netif_vdbg(priv, type, dev, format, args...) \ 143 + ({ \ 144 + if (0) \ 145 + netif_printk(priv, type, KERN_DEBUG, dev, format, ##args); \ 146 + 0; \ 147 + }) 148 + #endif 149 + 150 + 151 + #if defined(CONFIG_DEBUG_NET) 152 + #define DEBUG_NET_WARN_ON_ONCE(cond) (void)WARN_ON_ONCE(cond) 153 + #else 154 + #define DEBUG_NET_WARN_ON_ONCE(cond) BUILD_BUG_ON_INVALID(cond) 155 + #endif 156 + 157 + #endif /* _LINUX_NET_DEBUG_H */
+7
net/Kconfig.debug
··· 17 17 help 18 18 Enable debugging feature to track netns references. 19 19 This adds memory and cpu costs. 20 + 21 + config DEBUG_NET 22 + bool "Add generic networking debug" 23 + depends on DEBUG_KERNEL 24 + help 25 + Enable extra sanity checks in networking. 26 + This is mostly used by fuzzers, but is safe to select.
+9 -3
net/core/dev.c
··· 3265 3265 } 3266 3266 3267 3267 offset = skb_checksum_start_offset(skb); 3268 - BUG_ON(offset >= skb_headlen(skb)); 3268 + ret = -EINVAL; 3269 + if (WARN_ON_ONCE(offset >= skb_headlen(skb))) { 3270 + DO_ONCE_LITE(skb_dump, KERN_ERR, skb, false); 3271 + goto out; 3272 + } 3269 3273 csum = skb_checksum(skb, offset, skb->len - offset, 0); 3270 3274 3271 3275 offset += skb->csum_offset; 3272 - BUG_ON(offset + sizeof(__sum16) > skb_headlen(skb)); 3273 - 3276 + if (WARN_ON_ONCE(offset + sizeof(__sum16) > skb_headlen(skb))) { 3277 + DO_ONCE_LITE(skb_dump, KERN_ERR, skb, false); 3278 + goto out; 3279 + } 3274 3280 ret = skb_ensure_writable(skb, offset + sizeof(__sum16)); 3275 3281 if (ret) 3276 3282 goto out;