Linux Audio

Check our new training course

Loading...
v6.13.7
  1// SPDX-License-Identifier: GPL-2.0-only
  2#include <stddef.h>
  3#include <linux/bpf.h>
  4#include <bpf/bpf_helpers.h>
  5#include "bpf_misc.h"
  6
  7struct S {
  8	int x;
  9};
 10
 11struct C {
 12	int x;
 13	int y;
 14};
 15
 16struct {
 17	__uint(type, BPF_MAP_TYPE_ARRAY);
 18	__uint(max_entries, 1);
 19	__type(key, __u32);
 20	__type(value, struct S);
 21} map SEC(".maps");
 22
 23enum E {
 24	E_ITEM
 25};
 26
 27static int global_data_x = 100;
 28static int volatile global_data_y = 500;
 29
 30__noinline int foo(const struct S *s)
 31{
 32	if (s)
 33		return bpf_get_prandom_u32() < s->x;
 34
 35	return 0;
 36}
 37
 38__noinline int bar(int *x)
 39{
 40	if (x)
 41		*x &= bpf_get_prandom_u32();
 42
 43	return 0;
 44}
 45__noinline int baz(volatile int *x)
 46{
 47	if (x)
 48		*x &= bpf_get_prandom_u32();
 49
 50	return 0;
 51}
 52
 53__noinline int qux(enum E *e)
 54{
 55	if (e)
 56		return *e;
 57
 58	return 0;
 59}
 60
 61__noinline int quux(int (*arr)[10])
 62{
 63	if (arr)
 64		return (*arr)[9];
 65
 66	return 0;
 67}
 68
 69__noinline int quuz(int **p)
 70{
 71	if (p)
 72		*p = NULL;
 73
 74	return 0;
 75}
 76
 77SEC("cgroup_skb/ingress")
 78__success
 79int global_func9(struct __sk_buff *skb)
 80{
 81	int result = 0;
 82
 83	{
 84		const struct S s = {.x = skb->len };
 85
 86		result |= foo(&s);
 87	}
 88
 89	{
 90		const __u32 key = 1;
 91		const struct S *s = bpf_map_lookup_elem(&map, &key);
 92
 93		result |= foo(s);
 94	}
 95
 96	{
 97		const struct C c = {.x = skb->len, .y = skb->family };
 98
 99		result |= foo((const struct S *)&c);
100	}
101
102	{
103		result |= foo(NULL);
104	}
105
106	{
107		bar(&result);
108		bar(&global_data_x);
109	}
110
111	{
112		result |= baz(&global_data_y);
113	}
114
115	{
116		enum E e = E_ITEM;
117
118		result |= qux(&e);
119	}
120
121	{
122		int array[10] = {0};
123
124		result |= quux(&array);
125	}
126
127	{
128		int *p;
129
130		result |= quuz(&p);
131	}
132
133	return result ? 1 : 0;
134}
v6.8
  1// SPDX-License-Identifier: GPL-2.0-only
  2#include <stddef.h>
  3#include <linux/bpf.h>
  4#include <bpf/bpf_helpers.h>
  5#include "bpf_misc.h"
  6
  7struct S {
  8	int x;
  9};
 10
 11struct C {
 12	int x;
 13	int y;
 14};
 15
 16struct {
 17	__uint(type, BPF_MAP_TYPE_ARRAY);
 18	__uint(max_entries, 1);
 19	__type(key, __u32);
 20	__type(value, struct S);
 21} map SEC(".maps");
 22
 23enum E {
 24	E_ITEM
 25};
 26
 27static int global_data_x = 100;
 28static int volatile global_data_y = 500;
 29
 30__noinline int foo(const struct S *s)
 31{
 32	if (s)
 33		return bpf_get_prandom_u32() < s->x;
 34
 35	return 0;
 36}
 37
 38__noinline int bar(int *x)
 39{
 40	if (x)
 41		*x &= bpf_get_prandom_u32();
 42
 43	return 0;
 44}
 45__noinline int baz(volatile int *x)
 46{
 47	if (x)
 48		*x &= bpf_get_prandom_u32();
 49
 50	return 0;
 51}
 52
 53__noinline int qux(enum E *e)
 54{
 55	if (e)
 56		return *e;
 57
 58	return 0;
 59}
 60
 61__noinline int quux(int (*arr)[10])
 62{
 63	if (arr)
 64		return (*arr)[9];
 65
 66	return 0;
 67}
 68
 69__noinline int quuz(int **p)
 70{
 71	if (p)
 72		*p = NULL;
 73
 74	return 0;
 75}
 76
 77SEC("cgroup_skb/ingress")
 78__success
 79int global_func9(struct __sk_buff *skb)
 80{
 81	int result = 0;
 82
 83	{
 84		const struct S s = {.x = skb->len };
 85
 86		result |= foo(&s);
 87	}
 88
 89	{
 90		const __u32 key = 1;
 91		const struct S *s = bpf_map_lookup_elem(&map, &key);
 92
 93		result |= foo(s);
 94	}
 95
 96	{
 97		const struct C c = {.x = skb->len, .y = skb->family };
 98
 99		result |= foo((const struct S *)&c);
100	}
101
102	{
103		result |= foo(NULL);
104	}
105
106	{
107		bar(&result);
108		bar(&global_data_x);
109	}
110
111	{
112		result |= baz(&global_data_y);
113	}
114
115	{
116		enum E e = E_ITEM;
117
118		result |= qux(&e);
119	}
120
121	{
122		int array[10] = {0};
123
124		result |= quux(&array);
125	}
126
127	{
128		int *p;
129
130		result |= quuz(&p);
131	}
132
133	return result ? 1 : 0;
134}