Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 2abb5fad authored by Daniel Borkmann's avatar Daniel Borkmann
Browse files

Merge branch 'bpf-verifier-log-btf-prep'



Martin KaFai Lau says:

====================
This patch set has some changes and clean-up works for
the bpf_verifier_log.  They are the prep works for the
BTF (BPF Type Format).
====================

Signed-off-by: default avatarDaniel Borkmann <daniel@iogearbox.net>
parents 639a53da 77d2e05a
Loading
Loading
Loading
Loading
+10 −3
Original line number Diff line number Diff line
@@ -153,7 +153,7 @@ struct bpf_insn_aux_data {

#define BPF_VERIFIER_TMP_LOG_SIZE	1024

struct bpf_verifer_log {
struct bpf_verifier_log {
	u32 level;
	char kbuf[BPF_VERIFIER_TMP_LOG_SIZE];
	char __user *ubuf;
@@ -161,11 +161,16 @@ struct bpf_verifer_log {
	u32 len_total;
};

static inline bool bpf_verifier_log_full(const struct bpf_verifer_log *log)
static inline bool bpf_verifier_log_full(const struct bpf_verifier_log *log)
{
	return log->len_used >= log->len_total - 1;
}

static inline bool bpf_verifier_log_needed(const struct bpf_verifier_log *log)
{
	return log->level && log->ubuf && !bpf_verifier_log_full(log);
}

#define BPF_MAX_SUBPROGS 256

/* single container for all structs
@@ -185,13 +190,15 @@ struct bpf_verifier_env {
	bool allow_ptr_leaks;
	bool seen_direct_write;
	struct bpf_insn_aux_data *insn_aux_data; /* array of per-insn state */
	struct bpf_verifer_log log;
	struct bpf_verifier_log log;
	u32 subprog_starts[BPF_MAX_SUBPROGS];
	/* computes the stack depth of each bpf function */
	u16 subprog_stack_depth[BPF_MAX_SUBPROGS + 1];
	u32 subprog_cnt;
};

void bpf_verifier_vlog(struct bpf_verifier_log *log, const char *fmt,
		       va_list args);
__printf(2, 3) void bpf_verifier_log_write(struct bpf_verifier_env *env,
					   const char *fmt, ...);

+12 −9
Original line number Diff line number Diff line
@@ -168,15 +168,11 @@ struct bpf_call_arg_meta {

static DEFINE_MUTEX(bpf_verifier_lock);

static void log_write(struct bpf_verifier_env *env, const char *fmt,
void bpf_verifier_vlog(struct bpf_verifier_log *log, const char *fmt,
		       va_list args)
{
	struct bpf_verifer_log *log = &env->log;
	unsigned int n;

	if (!log->level || !log->ubuf || bpf_verifier_log_full(log))
		return;

	n = vscnprintf(log->kbuf, BPF_VERIFIER_TMP_LOG_SIZE, fmt, args);

	WARN_ONCE(n >= BPF_VERIFIER_TMP_LOG_SIZE - 1,
@@ -200,18 +196,25 @@ __printf(2, 3) void bpf_verifier_log_write(struct bpf_verifier_env *env,
{
	va_list args;

	if (!bpf_verifier_log_needed(&env->log))
		return;

	va_start(args, fmt);
	log_write(env, fmt, args);
	bpf_verifier_vlog(&env->log, fmt, args);
	va_end(args);
}
EXPORT_SYMBOL_GPL(bpf_verifier_log_write);

__printf(2, 3) static void verbose(void *private_data, const char *fmt, ...)
{
	struct bpf_verifier_env *env = private_data;
	va_list args;

	if (!bpf_verifier_log_needed(&env->log))
		return;

	va_start(args, fmt);
	log_write(private_data, fmt, args);
	bpf_verifier_vlog(&env->log, fmt, args);
	va_end(args);
}

@@ -5611,7 +5614,7 @@ static void free_states(struct bpf_verifier_env *env)
int bpf_check(struct bpf_prog **prog, union bpf_attr *attr)
{
	struct bpf_verifier_env *env;
	struct bpf_verifer_log *log;
	struct bpf_verifier_log *log;
	int ret = -EINVAL;

	/* no program is valid */