From 6668ed271eaefaa63e686bdfbedaeb7b8e492722 Mon Sep 17 00:00:00 2001 From: Kumar Kartikeya Dwivedi Date: Fri, 4 Sep 2026 10:43:19 +0200 Subject: selftests/bpf: Reject graph kptr use after RCU unlock Add a sleepable verifier test that loads a graph-node local kptr in an explicit RCU read-side critical section, then passes its node to bpf_rbtree_remove() after the section ends. Before the verifier fix, the stale NON_OWN_REF flag makes the node look like a live borrowed reference and the program is accepted. After the fix, the pointer is demoted without NON_OWN_REF and the graph kfunc argument is rejected. Also exercise a graph kptr loaded while a spin lock provides implicit RCU protection. The pointer must be invalidated when the lock is released, which guards the required ordering between non-owning-reference invalidation and RCU demotion. Update the existing fault-protected load test state description. The post-unlock pointer no longer carries NON_OWN_REF, but remains readable because the load is rewritten to use BPF_PROBE_MEM. Signed-off-by: Kumar Kartikeya Dwivedi Link: https://lore.kernel.org/r/20260904084325.52250-7-memxor@gmail.com Signed-off-by: Alexei Starovoitov --- scripts/genksyms/genksyms.h | 88 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 88 insertions(+) create mode 100644 scripts/genksyms/genksyms.h (limited to 'scripts/genksyms/genksyms.h') diff --git a/scripts/genksyms/genksyms.h b/scripts/genksyms/genksyms.h new file mode 100644 index 000000000..0c355075f --- /dev/null +++ b/scripts/genksyms/genksyms.h @@ -0,0 +1,88 @@ +/* SPDX-License-Identifier: GPL-2.0-or-later */ +/* Generate kernel symbol version hashes. + Copyright 1996, 1997 Linux International. + + New implementation contributed by Richard Henderson + Based on original work by Bjorn Ekwall + + This file is part of the Linux modutils. + + */ + +#ifndef MODUTILS_GENKSYMS_H +#define MODUTILS_GENKSYMS_H 1 + +#include +#include + +#include + +enum symbol_type { + SYM_NORMAL, SYM_TYPEDEF, SYM_ENUM, SYM_STRUCT, SYM_UNION, + SYM_ENUM_CONST +}; + +enum symbol_status { + STATUS_UNCHANGED, STATUS_DEFINED, STATUS_MODIFIED +}; + +struct string_list { + struct string_list *next; + enum symbol_type tag; + int in_source_file; + char *string; +}; + +struct symbol { + struct hlist_node hnode; + char *name; + enum symbol_type type; + struct string_list *defn; + struct symbol *expansion_trail; + struct symbol *visited; + int is_extern; + int is_declared; + enum symbol_status status; + int is_override; +}; + +typedef struct string_list **yystype; +#define YYSTYPE yystype + +extern int cur_line; +extern char *cur_filename; +extern int in_source_file; + +struct symbol *find_symbol(const char *name, enum symbol_type ns, int exact); +struct symbol *add_symbol(const char *name, enum symbol_type type, + struct string_list *defn, int is_extern); +void export_symbol(const char *); + +void free_node(struct string_list *list); +void free_list(struct string_list *s, struct string_list *e); +struct string_list *copy_node(struct string_list *); +struct string_list *copy_list_range(struct string_list *start, + struct string_list *end); + +int yylex(void); +int yyparse(void); + +extern bool dont_want_type_specifier; + +void error_with_pos(const char *, ...) __attribute__ ((format(printf, 1, 2))); + +/*----------------------------------------------------------------------*/ +#define xmalloc(size) ({ void *__ptr = malloc(size); \ + if(!__ptr && size != 0) { \ + fprintf(stderr, "out of memory\n"); \ + exit(1); \ + } \ + __ptr; }) +#define xstrdup(str) ({ char *__str = strdup(str); \ + if (!__str) { \ + fprintf(stderr, "out of memory\n"); \ + exit(1); \ + } \ + __str; }) + +#endif /* genksyms.h */ -- cgit v1.3.1