FAILED: patch "[PATCH] tracing: Reject string operand in the histogram expression" failed to apply to 5.4-stable tree
Subsystems (2)
[email protected]
maintainerThe patch below does not apply to the 5.4-stable tree.
If someone wants it applied there, or to any other stable or longterm tree, then please email the backport, including the original git commit id to <[email protected]>.
thanks,
greg k-h
------------------ original commit in Linus's tree ------------------
From a9d10ca4986571bffc19778742d508cc8dd13e02 Mon Sep 17 00:00:00 2001
From: Masami Hiramatsu <[email protected]>
Date: Wed, 28 Jul 2021 07:55:43 +0900
Subject: [PATCH] tracing: Reject string operand in the histogram expression
Since the string type can not be the target of the addition / subtraction operation, it must be rejected. Without this fix, the string type silently converted to digits.
kernel/trace/trace_events_hist.c +19 -1
@@ -65,7 +65,8 @@C (INVALID_SORT_MODIFIER ,"Invalid sort modifier" ), \C (EMPTY_SORT_FIELD ,"Empty sort field" ), \C (TOO_MANY_SORT_FIELDS ,"Too many sort fields (Max = 2)" ), \ -C (INVALID_SORT_FIELD ,"Sort field must be a key or a val" ), +C (INVALID_SORT_FIELD ,"Sort field must be a key or a val" ), \ +C (INVALID_STR_OPERAND ,"String type can not be an operand in expression" ), #undef C #define C(a, b) HIST_ERR_##a
@@ -2156,6 +2157,13 @@ static struct hist_field *parse_unary(struct hist_trigger_data *hist_data, ret =PTR_ERR (operand1); goto free; } +if (operand1->flags &HIST_FIELD_FL_STRING ) { +/* String type can not be the operand of unary operator. */ +hist_err (file->tr,HIST_ERR_INVALID_STR_OPERAND ,errpos (str)); +destroy_hist_field (operand1,0 ); + ret = -EINVAL ; + goto free; + } expr->flags |= operand1->flags & (HIST_FIELD_FL_TIMESTAMP |HIST_FIELD_FL_TIMESTAMP_USECS );
@@ -2257,6 +2265,11 @@ static struct hist_field *parse_expr(struct hist_trigger_data *hist_data, operand1 =NULL ; goto free; } +if (operand1->flags &HIST_FIELD_FL_STRING ) { +hist_err (file->tr,HIST_ERR_INVALID_STR_OPERAND ,errpos (operand1_str)); + ret = -EINVAL ; + goto free; + }/* rest of string could be another expression e.g. b+c in a+b+c */ operand_flags =0 ;
@@ -2266,6 +2279,11 @@ static struct hist_field *parse_expr(struct hist_trigger_data *hist_data, operand2 =NULL ; goto free; } +if (operand2->flags &HIST_FIELD_FL_STRING ) { +hist_err (file->tr,HIST_ERR_INVALID_STR_OPERAND ,errpos (str)); + ret = -EINVAL ; + goto free; + } ret =check_expr_operands (file->tr, operand1, operand2);if (ret)
Masami Hiramatsu
maintainerPATCH 1/1 tracing: Reject string operand in the histogram expression
commit a9d10ca4986571bffc19778742d508cc8dd13e02 upstream
Since the string type can not be the target of the addition / subtraction operation, it must be rejected. Without this fix, the string type silently converted to digits.
--- kernel/trace/trace_events_hist.c | 20 +++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-)
kernel/trace/trace_events_hist.c +19 -1
@@ -66,7 +66,8 @@C (INVALID_SUBSYS_EVENT ,"Invalid subsystem or event name" ), \C (INVALID_REF_KEY ,"Using variable references in keys not supported" ), \C (VAR_NOT_FOUND ,"Couldn't find variable" ), \ -C (FIELD_NOT_FOUND ,"Couldn't find field" ), +C (FIELD_NOT_FOUND ,"Couldn't find field" ), \ +C (INVALID_STR_OPERAND ,"String type can not be an operand in expression" ), #undef C #define C(a, b) HIST_ERR_##a
@@ -3038,6 +3039,13 @@ static struct hist_field *parse_unary(struct hist_trigger_data *hist_data, ret =PTR_ERR (operand1); goto free; } +if (operand1->flags &HIST_FIELD_FL_STRING ) { +/* String type can not be the operand of unary operator. */ +hist_err (file->tr,HIST_ERR_INVALID_STR_OPERAND ,errpos (str)); +destroy_hist_field (operand1,0 ); + ret = -EINVAL ; + goto free; + } expr->flags |= operand1->flags & (HIST_FIELD_FL_TIMESTAMP |HIST_FIELD_FL_TIMESTAMP_USECS );
@@ -3139,6 +3147,11 @@ static struct hist_field *parse_expr(struct hist_trigger_data *hist_data, operand1 =NULL ; goto free; } +if (operand1->flags &HIST_FIELD_FL_STRING ) { +hist_err (file->tr,HIST_ERR_INVALID_STR_OPERAND ,errpos (operand1_str)); + ret = -EINVAL ; + goto free; + }/* rest of string could be another expression e.g. b+c in a+b+c */ operand_flags =0 ;
@@ -3148,6 +3161,11 @@ static struct hist_field *parse_expr(struct hist_trigger_data *hist_data, operand2 =NULL ; goto free; } +if (operand2->flags &HIST_FIELD_FL_STRING ) { +hist_err (file->tr,HIST_ERR_INVALID_STR_OPERAND ,errpos (str)); + ret = -EINVAL ; + goto free; + } ret =check_expr_operands (file->tr, operand1, operand2);if (ret)