Skip to content

Commit c1ddfdb

Browse files
committed
Merge branch 'net-add-debug-checks-to-skb_reset_xxx_header'
Eric Dumazet says: ==================== net: add debug checks to skb_reset_xxx_header() Add debug checks (only enabled for CONFIG_DEBUG_NET=y builds), to catch bugs earlier. ==================== Link: https://patch.msgid.link/20241105174403.850330-1-edumazet@google.com Signed-off-by: Jakub Kicinski <kuba@kernel.org>
2 parents 3545f9b + 3b6167e commit c1ddfdb

File tree

1 file changed

+35
-12
lines changed

1 file changed

+35
-12
lines changed

include/linux/skbuff.h

Lines changed: 35 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -2909,9 +2909,19 @@ static inline void skb_reset_inner_headers(struct sk_buff *skb)
29092909
skb->inner_transport_header = skb->transport_header;
29102910
}
29112911

2912+
static inline int skb_mac_header_was_set(const struct sk_buff *skb)
2913+
{
2914+
return skb->mac_header != (typeof(skb->mac_header))~0U;
2915+
}
2916+
29122917
static inline void skb_reset_mac_len(struct sk_buff *skb)
29132918
{
2914-
skb->mac_len = skb->network_header - skb->mac_header;
2919+
if (!skb_mac_header_was_set(skb)) {
2920+
DEBUG_NET_WARN_ON_ONCE(1);
2921+
skb->mac_len = 0;
2922+
} else {
2923+
skb->mac_len = skb->network_header - skb->mac_header;
2924+
}
29152925
}
29162926

29172927
static inline unsigned char *skb_inner_transport_header(const struct sk_buff
@@ -2927,7 +2937,10 @@ static inline int skb_inner_transport_offset(const struct sk_buff *skb)
29272937

29282938
static inline void skb_reset_inner_transport_header(struct sk_buff *skb)
29292939
{
2930-
skb->inner_transport_header = skb->data - skb->head;
2940+
long offset = skb->data - skb->head;
2941+
2942+
DEBUG_NET_WARN_ON_ONCE(offset != (typeof(skb->inner_transport_header))offset);
2943+
skb->inner_transport_header = offset;
29312944
}
29322945

29332946
static inline void skb_set_inner_transport_header(struct sk_buff *skb,
@@ -2944,7 +2957,10 @@ static inline unsigned char *skb_inner_network_header(const struct sk_buff *skb)
29442957

29452958
static inline void skb_reset_inner_network_header(struct sk_buff *skb)
29462959
{
2947-
skb->inner_network_header = skb->data - skb->head;
2960+
long offset = skb->data - skb->head;
2961+
2962+
DEBUG_NET_WARN_ON_ONCE(offset != (typeof(skb->inner_network_header))offset);
2963+
skb->inner_network_header = offset;
29482964
}
29492965

29502966
static inline void skb_set_inner_network_header(struct sk_buff *skb,
@@ -2966,7 +2982,10 @@ static inline unsigned char *skb_inner_mac_header(const struct sk_buff *skb)
29662982

29672983
static inline void skb_reset_inner_mac_header(struct sk_buff *skb)
29682984
{
2969-
skb->inner_mac_header = skb->data - skb->head;
2985+
long offset = skb->data - skb->head;
2986+
2987+
DEBUG_NET_WARN_ON_ONCE(offset != (typeof(skb->inner_mac_header))offset);
2988+
skb->inner_mac_header = offset;
29702989
}
29712990

29722991
static inline void skb_set_inner_mac_header(struct sk_buff *skb,
@@ -2988,7 +3007,10 @@ static inline unsigned char *skb_transport_header(const struct sk_buff *skb)
29883007

29893008
static inline void skb_reset_transport_header(struct sk_buff *skb)
29903009
{
2991-
skb->transport_header = skb->data - skb->head;
3010+
long offset = skb->data - skb->head;
3011+
3012+
DEBUG_NET_WARN_ON_ONCE(offset != (typeof(skb->transport_header))offset);
3013+
skb->transport_header = offset;
29923014
}
29933015

29943016
static inline void skb_set_transport_header(struct sk_buff *skb,
@@ -3005,7 +3027,10 @@ static inline unsigned char *skb_network_header(const struct sk_buff *skb)
30053027

30063028
static inline void skb_reset_network_header(struct sk_buff *skb)
30073029
{
3008-
skb->network_header = skb->data - skb->head;
3030+
long offset = skb->data - skb->head;
3031+
3032+
DEBUG_NET_WARN_ON_ONCE(offset != (typeof(skb->network_header))offset);
3033+
skb->network_header = offset;
30093034
}
30103035

30113036
static inline void skb_set_network_header(struct sk_buff *skb, const int offset)
@@ -3014,11 +3039,6 @@ static inline void skb_set_network_header(struct sk_buff *skb, const int offset)
30143039
skb->network_header += offset;
30153040
}
30163041

3017-
static inline int skb_mac_header_was_set(const struct sk_buff *skb)
3018-
{
3019-
return skb->mac_header != (typeof(skb->mac_header))~0U;
3020-
}
3021-
30223042
static inline unsigned char *skb_mac_header(const struct sk_buff *skb)
30233043
{
30243044
DEBUG_NET_WARN_ON_ONCE(!skb_mac_header_was_set(skb));
@@ -3043,7 +3063,10 @@ static inline void skb_unset_mac_header(struct sk_buff *skb)
30433063

30443064
static inline void skb_reset_mac_header(struct sk_buff *skb)
30453065
{
3046-
skb->mac_header = skb->data - skb->head;
3066+
long offset = skb->data - skb->head;
3067+
3068+
DEBUG_NET_WARN_ON_ONCE(offset != (typeof(skb->mac_header))offset);
3069+
skb->mac_header = offset;
30473070
}
30483071

30493072
static inline void skb_set_mac_header(struct sk_buff *skb, const int offset)

0 commit comments

Comments
 (0)