Quellcodebibliothek Statistik Leitseite products/sources/formale Sprachen/C/Linux/tools/testing/selftests/bpf/progs/   (Open Source Betriebssystem Version 6.17.9©)  Datei vom 24.10.2025 mit Größe 2 kB image not shown  

Quelle  cb_refs.c   Sprache: C

 
// SPDX-License-Identifier: GPL-2.0
#include <vmlinux.h>
#include <bpf/bpf_tracing.h>
#include <bpf/bpf_helpers.h>
#include "../test_kmods/bpf_testmod_kfunc.h"

struct map_value {
 struct prog_test_ref_kfunc __kptr *ptr;
};

struct {
 __uint(type, BPF_MAP_TYPE_ARRAY);
 __type(key, int);
 __type(value, struct map_value);
 __uint(max_entries, 16);
} array_map SEC(".maps");

static __noinline int cb1(void *map, void *key, void *value, void *ctx)
{
 void *p = *(void **)ctx;
 bpf_kfunc_call_test_release(p);
 /* Without the fix this would cause underflow */
 return 0;
}

SEC("?tc")
int underflow_prog(void *ctx)
{
 struct prog_test_ref_kfunc *p;
 unsigned long sl = 0;

 p = bpf_kfunc_call_test_acquire(&sl);
 if (!p)
  return 0;
 bpf_for_each_map_elem(&array_map, cb1, &p, 0);
 bpf_kfunc_call_test_release(p);
 return 0;
}

static __always_inline int cb2(void *map, void *key, void *value, void *ctx)
{
 unsigned long sl = 0;

 *(void **)ctx = bpf_kfunc_call_test_acquire(&sl);
 /* Without the fix this would leak memory */
 return 0;
}

SEC("?tc")
int leak_prog(void *ctx)
{
 struct prog_test_ref_kfunc *p;
 struct map_value *v;

 v = bpf_map_lookup_elem(&array_map, &(int){0});
 if (!v)
  return 0;

 p = NULL;
 bpf_for_each_map_elem(&array_map, cb2, &p, 0);
 p = bpf_kptr_xchg(&v->ptr, p);
 if (p)
  bpf_kfunc_call_test_release(p);
 return 0;
}

static __always_inline int cb(void *map, void *key, void *value, void *ctx)
{
 return 0;
}

static __always_inline int cb3(void *map, void *key, void *value, void *ctx)
{
 unsigned long sl = 0;
 void *p;

 bpf_kfunc_call_test_acquire(&sl);
 bpf_for_each_map_elem(&array_map, cb, &p, 0);
 /* It should only complain here, not in cb. This is why we need
 * callback_ref to be set to frameno.
 */

 return 0;
}

SEC("?tc")
int nested_cb(void *ctx)
{
 struct prog_test_ref_kfunc *p;
 unsigned long sl = 0;
 int sp = 0;

 p = bpf_kfunc_call_test_acquire(&sl);
 if (!p)
  return 0;
 bpf_for_each_map_elem(&array_map, cb3, &sp, 0);
 bpf_kfunc_call_test_release(p);
 return 0;
}

SEC("?tc")
int non_cb_transfer_ref(void *ctx)
{
 struct prog_test_ref_kfunc *p;
 unsigned long sl = 0;

 p = bpf_kfunc_call_test_acquire(&sl);
 if (!p)
  return 0;
 cb1(NULL, NULL, NULL, &p);
 bpf_kfunc_call_test_acquire(&sl);
 return 0;
}

char _license[] SEC("license") = "GPL";

Messung V0.5
C=95 H=96 G=95

¤ Dauer der Verarbeitung: 0.2 Sekunden  ¤

*© Formatika GbR, Deutschland






Wurzel

Suchen

Beweissystem der NASA

Beweissystem Isabelle

NIST Cobol Testsuite

Cephes Mathematical Library

Wiener Entwicklungsmethode

Haftungshinweis

Die Informationen auf dieser Webseite wurden nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit, noch Qualität der bereit gestellten Informationen zugesichert.

Bemerkung:

Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.