[PATCH 1/2] pahole: fix discarded-qualifiers for strchr/strstr.
"d.hourtoulle" <[email protected]>
| Newsgroups | org.kernel.vger.dwarves |
|---|---|
| Message-ID | <[email protected]> |
From: Damien Hourtoulle <[email protected]> Glibc 2.43 added C23 const-preserving overloads : https://sourceware.org/glibc/wiki/Release/2.43. For the function prototype__new, fix local variable declaration to use the correct const char* type instead of char*, removing the need to discard the const qualifier. Also fix a pre-existing bug in type__find_type_enum: when iterating over a '+'-concatenated list of enum names, after advancing to the next segment the new separator was not nullified, causing "second+third" to be passed to cu__find_enumeration_by_name instead of "second". Add a null check before writing to sep_mutable to avoid a null dereference when no further '+' is present. Signed-off-by: Damien Hourtoulle <[email protected]> --- btf_encoder.c | 2 +- pahole.c | 35 ++++++++++++++++++----------------- 2 files changed, 19 insertions(+), 18 deletions(-) diff --git a/btf_encoder.c b/btf_encoder.c index aa7cd1c..d36984a 100644 --- a/btf_encoder.c +++ b/btf_encoder.c @@ -1218,7 +1218,7 @@ static bool str_contains_non_fn_suffix(const char *str) { ".cold", ".part" }; - char *suffix = strchr(str, '.'); + const char *suffix = strchr(str, '.'); int i; if (!suffix) diff --git a/pahole.c b/pahole.c index 02a0d19..e4bfb69 100644 --- a/pahole.c +++ b/pahole.c @@ -2483,7 +2483,7 @@ static int64_t type_instance__int_value(struct type_instance *instance, const ch int byte_offset = 0; if (!member) { - char *sep = strchr(member_name_orig, '.'); + const char *sep = strchr(member_name_orig, '.'); if (!sep) return -1; @@ -2496,8 +2496,8 @@ static int64_t type_instance__int_value(struct type_instance *instance, const ch char *member_name = member_name_alloc; struct type *type = instance->type; - sep = member_name_alloc + (sep - member_name_orig); - *sep = 0; + char *sep_mutable = member_name_alloc + (sep - member_name_orig); // sep mutable for the copy + *sep_mutable = 0; while (1) { member = type__find_member_by_name(type, member_name); @@ -2510,9 +2510,9 @@ out_free_member_name: type = tag__type(cu__type(cu, member->tag.type)); if (type == NULL) goto out_free_member_name; - member_name = sep + 1; - sep = strchr(member_name, '.'); - if (!sep) + member_name = sep_mutable + 1; + sep_mutable = strchr(member_name, '.'); + if (!sep_mutable) break; } @@ -2950,7 +2950,7 @@ static struct prototype *prototype__new(const char *expression) strcpy(prototype->name, expression); - const char *name = prototype->name; + char *name = prototype->name; prototype->nr_args = 0; @@ -2964,10 +2964,9 @@ static struct prototype *prototype__new(const char *expression) if (args_close == NULL) goto out_no_closing_parens; + *args_open++ = *args_close = '\0'; char *args = args_open; - *args++ = *args_close = '\0'; - while (isspace(*args)) ++args; @@ -3114,7 +3113,7 @@ static int type__find_type_enum(struct type *type, struct cu *cu, const char *ty return type__add_type_enum(type, te, cu); // Now look at a 'virtual enum', i.e. the concatenation of multiple enums - char *sep = strchr(type_enum, '+'); + const char *sep = strchr(type_enum, '+'); if (!sep) return -1; @@ -3126,13 +3125,13 @@ static int type__find_type_enum(struct type *type, struct cu *cu, const char *ty int ret = -1; - sep = type_enums + (sep - type_enum); + char *sep_mutable = type_enums + (sep - type_enum); + char *cur = type_enums; - type_enum = type_enums; - *sep = '\0'; + *sep_mutable = '\0'; while (1) { - te = cu__find_enumeration_by_name(cu, type_enum, NULL); + te = cu__find_enumeration_by_name(cu, cur, NULL); if (!te) goto out; @@ -3141,10 +3140,12 @@ static int type__find_type_enum(struct type *type, struct cu *cu, const char *ty if (ret) goto out; - if (sep == NULL) + if (sep_mutable == NULL) break; - type_enum = sep + 1; - sep = strchr(type_enum, '+'); + cur = sep_mutable + 1; + sep_mutable = strchr(cur, '+'); + if (sep_mutable) + *sep_mutable = '\0'; } ret = 0; -- 2.53.0