aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAlan Maguire <alan.maguire@oracle.com>2023-10-23 10:57:26 +0100
committerArnaldo Carvalho de Melo <acme@redhat.com>2023-10-25 15:23:22 -0300
commitc129fa7579483bba5b050ba54cc683e11d2b70f3 (patch)
tree86bde74b7a87757dc24139aa28d707264e54f976
parent74a238a4368223c9502d2b24ff71f93039a45328 (diff)
downloadpahole-c129fa7579483bba5b050ba54cc683e11d2b70f3.tar.gz
pahole: Add --btf_features_strict to reject unknown BTF features
--btf_features is used to specify the list of requested features for BTF encoding. However, it is not strict in rejecting requests with unknown features; this allows us to use the same parameters regardless of pahole version. --btf_features_strict carries out the same encoding with the same feature set, but will fail if an unrecognized feature is specified. So pahole -J --btf_features=enum64,foo will succeed, while pahole -J --btf_features_strict=enum64,foo will not. Suggested-by: Andrii Nakryiko <andrii@kernel.org> Suggested-by: Eduard Zingerman <eddyz87@gmail.com> Signed-off-by: Alan Maguire <alan.maguire@oracle.com> Acked-by: Andrii Nakryiko <andrii@kernel.org> Acked-by: Eduard Zingerman <eddyz87@gmail.com> Acked-by: Jiri Olsa <jolsa@kernel.org> Tested-by: Arnaldo Carvalho de Melo <acme@redhat.com> Cc: Alexei Starovoitov <ast@kernel.org> Cc: Andrii Nakryiko <andrii.nakryiko@gmail.com> Cc: Daniel Borkmann <daniel@iogearbox.net> Cc: Hao Luo <haoluo@google.com> Cc: John Fastabend <john.fastabend@gmail.com> Cc: KP Singh <kpsingh@kernel.org> Cc: Martin KaFai Lau <martin.lau@linux.dev> Cc: Mykola Lysenko <mykolal@fb.com> Cc: Song Liu <song@kernel.org> Cc: Stanislav Fomichev <sdf@google.com> Cc: Yonghong Song <yhs@fb.com> Cc: bpf@vger.kernel.org Link: https://lore.kernel.org/r/20231023095726.1179529-6-alan.maguire@oracle.com Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
-rw-r--r--man-pages/pahole.14
-rw-r--r--pahole.c21
2 files changed, 22 insertions, 3 deletions
diff --git a/man-pages/pahole.1 b/man-pages/pahole.1
index 61489157..ea9045cd 100644
--- a/man-pages/pahole.1
+++ b/man-pages/pahole.1
@@ -298,6 +298,10 @@ Encode BTF using the specified feature list, or specify 'all' for all features s
So for example, specifying \-\-btf_encode=var,enum64 will result in a BTF encoding that (as well as encoding basic BTF information) will contain variables and enum64 values.
.TP
+.B \-\-btf_features_strict
+Identical to \-\-btf_features above, but pahole will exit if it encounters an unrecognized feature.
+
+.TP
.B \-\-supported_btf_features
Show set of BTF features supported by \-\-btf_features option and exit. Useful for checking which features are supported since \-\-btf_features will not emit an error if an unrecognized feature is specified.
diff --git a/pahole.c b/pahole.c
index 37fd2a4b..768a2feb 100644
--- a/pahole.c
+++ b/pahole.c
@@ -1231,6 +1231,7 @@ ARGP_PROGRAM_VERSION_HOOK_DEF = dwarves_print_version;
#define ARGP_skip_encoding_btf_inconsistent_proto 340
#define ARGP_btf_features 341
#define ARGP_supported_btf_features 342
+#define ARGP_btf_features_strict 343
/* --btf_features=feature1[,feature2,..] allows us to specify
* a list of requested BTF features or "all" to enable all features.
@@ -1334,7 +1335,7 @@ static void show_supported_btf_features(FILE *output)
* Explicitly ignores unrecognized features to allow future specification
* of new opt-in features.
*/
-static void parse_btf_features(const char *features)
+static void parse_btf_features(const char *features, bool strict)
{
char *saveptr = NULL, *s, *feature_name;
char f[BTF_MAX_FEATURE_STR];
@@ -1355,6 +1356,12 @@ static void parse_btf_features(const char *features)
struct btf_feature *feature = find_btf_feature(feature_name);
if (!feature) {
+ if (strict) {
+ fprintf(stderr, "Feature '%s' in '%s' is not supported. Supported BTF features are:\n",
+ feature_name, features);
+ show_supported_btf_features(stderr);
+ exit(EXIT_FAILURE);
+ }
if (global_verbose)
fprintf(stderr, "Ignoring unsupported feature '%s'\n",
feature_name);
@@ -1798,6 +1805,12 @@ static const struct argp_option pahole__options[] = {
.doc = "Show list of btf_features supported by pahole and exit."
},
{
+ .name = "btf_features_strict",
+ .key = ARGP_btf_features_strict,
+ .arg = "FEATURE_LIST_STRICT",
+ .doc = "Specify supported BTF features in FEATURE_LIST_STRICT or 'all' for all supported features. Unlike --btf_features, unrecognized features will trigger an error."
+ },
+ {
.name = NULL,
}
};
@@ -1942,7 +1955,7 @@ static error_t pahole__options_parser(int key, char *arg,
case ARGP_btf_gen_floats:
conf_load.btf_gen_floats = true; break;
case ARGP_btf_gen_all:
- parse_btf_features("all"); break;
+ parse_btf_features("all", false); break;
case ARGP_with_flexible_array:
show_with_flexible_array = true; break;
case ARGP_prettify_input_filename:
@@ -1973,9 +1986,11 @@ static error_t pahole__options_parser(int key, char *arg,
case ARGP_skip_encoding_btf_inconsistent_proto:
conf_load.skip_encoding_btf_inconsistent_proto = true; break;
case ARGP_btf_features:
- parse_btf_features(arg); break;
+ parse_btf_features(arg, false); break;
case ARGP_supported_btf_features:
show_supported_btf_features(stdout); exit(0);
+ case ARGP_btf_features_strict:
+ parse_btf_features(arg, true); break;
default:
return ARGP_ERR_UNKNOWN;
}