Skip to content

Commit ffaff18

Browse files
mykyta5Alexei Starovoitov
authored andcommitted
selftests/bpf: improve error messages in veristat
Return error if preset parsing fails. Avoid proceeding with veristat run if preset does not parse. Before: ``` ./veristat set_global_vars.bpf.o -G "arr[999999999999999999999] = 1" Failed to parse value '999999999999999999999' Processing 'set_global_vars.bpf.o'... File Program Verdict Duration (us) Insns States Program size Jited size --------------------- ---------------- ------- ------------- ----- ------ ------------ ---------- set_global_vars.bpf.o test_set_globals success 27 64 0 82 0 --------------------- ---------------- ------- ------------- ----- ------ ------------ ---------- Done. Processed 1 files, 0 programs. Skipped 1 files, 0 programs. ``` After: ``` ./veristat set_global_vars.bpf.o -G "arr[999999999999999999999] = 1" Failed to parse value '999999999999999999999' Failed to parse global variable presets: arr[999999999999999999999] = 1 ``` Improve error messages: * If preset struct member can't be found. * Array index out of bounds Extract rtrim function. Signed-off-by: Mykyta Yatsenko <[email protected]> Acked-by: Eduard Zingerman <[email protected]> Link: https://lore.kernel.org/r/[email protected] Signed-off-by: Alexei Starovoitov <[email protected]>
1 parent bacdf5a commit ffaff18

File tree

1 file changed

+25
-11
lines changed

1 file changed

+25
-11
lines changed

tools/testing/selftests/bpf/veristat.c

Lines changed: 25 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -890,6 +890,18 @@ static bool is_desc_sym(char c)
890890
return c == 'v' || c == 'V' || c == '.' || c == '!' || c == '_';
891891
}
892892

893+
static char *rtrim(char *str)
894+
{
895+
int i;
896+
897+
for (i = strlen(str) - 1; i > 0; --i) {
898+
if (!isspace(str[i]))
899+
break;
900+
str[i] = '\0';
901+
}
902+
return str;
903+
}
904+
893905
static int parse_stat(const char *stat_name, struct stat_specs *specs)
894906
{
895907
int id;
@@ -1666,7 +1678,7 @@ static int append_preset_atom(struct var_preset *preset, char *value, bool is_in
16661678
static int parse_var_atoms(const char *full_var, struct var_preset *preset)
16671679
{
16681680
char expr[256], var[256], *name, *saveptr;
1669-
int n, len, off;
1681+
int n, len, off, err;
16701682

16711683
snprintf(expr, sizeof(expr), "%s", full_var);
16721684
preset->atom_count = 0;
@@ -1677,15 +1689,19 @@ static int parse_var_atoms(const char *full_var, struct var_preset *preset)
16771689
fprintf(stderr, "Can't parse %s\n", name);
16781690
return -EINVAL;
16791691
}
1680-
append_preset_atom(preset, var, false);
1692+
err = append_preset_atom(preset, var, false);
1693+
if (err)
1694+
return err;
16811695

16821696
/* parse optional array indexes */
16831697
while (off < len) {
16841698
if (sscanf(name + off, " [ %[a-zA-Z0-9_] ] %n", var, &n) != 1) {
16851699
fprintf(stderr, "Can't parse %s as index\n", name + off);
16861700
return -EINVAL;
16871701
}
1688-
append_preset_atom(preset, var, true);
1702+
err = append_preset_atom(preset, var, true);
1703+
if (err)
1704+
return err;
16891705
off += n;
16901706
}
16911707
}
@@ -1697,7 +1713,7 @@ static int append_var_preset(struct var_preset **presets, int *cnt, const char *
16971713
void *tmp;
16981714
struct var_preset *cur;
16991715
char var[256], val[256];
1700-
int n, err, i;
1716+
int n, err;
17011717

17021718
tmp = realloc(*presets, (*cnt + 1) * sizeof(**presets));
17031719
if (!tmp)
@@ -1712,11 +1728,7 @@ static int append_var_preset(struct var_preset **presets, int *cnt, const char *
17121728
return -EINVAL;
17131729
}
17141730
/* Remove trailing spaces from var, as scanf may add those */
1715-
for (i = strlen(var) - 1; i > 0; --i) {
1716-
if (!isspace(var[i]))
1717-
break;
1718-
var[i] = '\0';
1719-
}
1731+
rtrim(var);
17201732

17211733
err = parse_rvalue(val, &cur->value);
17221734
if (err)
@@ -1869,7 +1881,7 @@ static int adjust_var_secinfo_array(struct btf *btf, int tid, struct field_acces
18691881
if (err)
18701882
return err;
18711883
if (idx < 0 || idx >= barr->nelems) {
1872-
fprintf(stderr, "Array index %lld is out of bounds [0, %u]: %s\n",
1884+
fprintf(stderr, "Array index %lld is out of bounds [0, %u): %s\n",
18731885
idx, barr->nelems, array_name);
18741886
return -EINVAL;
18751887
}
@@ -1928,7 +1940,7 @@ static int adjust_var_secinfo_member(const struct btf *btf,
19281940
}
19291941
}
19301942

1931-
return -EINVAL;
1943+
return -ESRCH;
19321944
}
19331945

19341946
static int adjust_var_secinfo(struct btf *btf, const struct btf_type *t,
@@ -1955,6 +1967,8 @@ static int adjust_var_secinfo(struct btf *btf, const struct btf_type *t,
19551967
break;
19561968
case FIELD_NAME:
19571969
err = adjust_var_secinfo_member(btf, base_type, 0, atom->name, sinfo);
1970+
if (err == -ESRCH)
1971+
fprintf(stderr, "Can't find '%s'\n", atom->name);
19581972
prev_name = atom->name;
19591973
break;
19601974
default:

0 commit comments

Comments
 (0)