Commit ef66c547 authored by David Vernet's avatar David Vernet Committed by Alexei Starovoitov

bpf: Allow multiple modifiers in reg_type_str() prefix

reg_type_str() in the verifier currently only allows a single register
type modifier to be present in the 'prefix' string which is eventually
stored in the env type_str_buf. This currently works fine because there
are no overlapping type modifiers, but once PTR_TRUSTED is added, that
will no longer be the case. This patch updates reg_type_str() to support
having multiple modifiers in the prefix string, and updates the size of
type_str_buf to be 128 bytes.
Signed-off-by: default avatarDavid Vernet <void@manifault.com>
Link: https://lore.kernel.org/r/20221120051004.3605026-2-void@manifault.comSigned-off-by: default avatarAlexei Starovoitov <ast@kernel.org>
parent ee748cd9
...@@ -19,7 +19,7 @@ ...@@ -19,7 +19,7 @@
*/ */
#define BPF_MAX_VAR_SIZ (1 << 29) #define BPF_MAX_VAR_SIZ (1 << 29)
/* size of type_str_buf in bpf_verifier. */ /* size of type_str_buf in bpf_verifier. */
#define TYPE_STR_BUF_LEN 64 #define TYPE_STR_BUF_LEN 128
/* Liveness marks, used for registers and spilled-regs (in stack slots). /* Liveness marks, used for registers and spilled-regs (in stack slots).
* Read marks propagate upwards until they find a write mark; they record that * Read marks propagate upwards until they find a write mark; they record that
......
...@@ -557,7 +557,7 @@ static bool is_cmpxchg_insn(const struct bpf_insn *insn) ...@@ -557,7 +557,7 @@ static bool is_cmpxchg_insn(const struct bpf_insn *insn)
static const char *reg_type_str(struct bpf_verifier_env *env, static const char *reg_type_str(struct bpf_verifier_env *env,
enum bpf_reg_type type) enum bpf_reg_type type)
{ {
char postfix[16] = {0}, prefix[32] = {0}; char postfix[16] = {0}, prefix[64] = {0};
static const char * const str[] = { static const char * const str[] = {
[NOT_INIT] = "?", [NOT_INIT] = "?",
[SCALAR_VALUE] = "scalar", [SCALAR_VALUE] = "scalar",
...@@ -589,16 +589,13 @@ static const char *reg_type_str(struct bpf_verifier_env *env, ...@@ -589,16 +589,13 @@ static const char *reg_type_str(struct bpf_verifier_env *env,
strncpy(postfix, "_or_null", 16); strncpy(postfix, "_or_null", 16);
} }
if (type & MEM_RDONLY) snprintf(prefix, sizeof(prefix), "%s%s%s%s%s",
strncpy(prefix, "rdonly_", 32); type & MEM_RDONLY ? "rdonly_" : "",
if (type & MEM_RINGBUF) type & MEM_RINGBUF ? "ringbuf_" : "",
strncpy(prefix, "ringbuf_", 32); type & MEM_USER ? "user_" : "",
if (type & MEM_USER) type & MEM_PERCPU ? "percpu_" : "",
strncpy(prefix, "user_", 32); type & PTR_UNTRUSTED ? "untrusted_" : ""
if (type & MEM_PERCPU) );
strncpy(prefix, "percpu_", 32);
if (type & PTR_UNTRUSTED)
strncpy(prefix, "untrusted_", 32);
snprintf(env->type_str_buf, TYPE_STR_BUF_LEN, "%s%s%s", snprintf(env->type_str_buf, TYPE_STR_BUF_LEN, "%s%s%s",
prefix, str[base_type(type)], postfix); prefix, str[base_type(type)], postfix);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment