| From: Rikard Falkeborn <rikard.falkeborn@gmail.com> |
| Date: Tue, 9 Apr 2019 11:15:29 +0200 |
| Subject: tools lib traceevent: Fix missing equality check for strcmp |
| |
| commit f32c2877bcb068a718bb70094cd59ccc29d4d082 upstream. |
| |
| There was a missing comparison with 0 when checking if type is "s64" or |
| "u64". Therefore, the body of the if-statement was entered if "type" was |
| "u64" or not "s64", which made the first strcmp() redundant since if |
| type is "u64", it's not "s64". |
| |
| If type is "s64", the body of the if-statement is not entered but since |
| the remainder of the function consists of if-statements which will not |
| be entered if type is "s64", we will just return "val", which is |
| correct, albeit at the cost of a few more calls to strcmp(), i.e., it |
| will behave just as if the if-statement was entered. |
| |
| If type is neither "s64" or "u64", the body of the if-statement will be |
| entered incorrectly and "val" returned. This means that any type that is |
| checked after "s64" and "u64" is handled the same way as "s64" and |
| "u64", i.e., the limiting of "val" to fit in for example "s8" is never |
| reached. |
| |
| This was introduced in the kernel tree when the sources were copied from |
| trace-cmd in commit f7d82350e597 ("tools/events: Add files to create |
| libtraceevent.a"), and in the trace-cmd repo in 1cdbae6035cei |
| ("Implement typecasting in parser") when the function was introduced, |
| i.e., it has always behaved the wrong way. |
| |
| Detected by cppcheck. |
| |
| Signed-off-by: Rikard Falkeborn <rikard.falkeborn@gmail.com> |
| Reviewed-by: Steven Rostedt (VMware) <rostedt@goodmis.org> |
| Cc: Tzvetomir Stoyanov <tstoyanov@vmware.com> |
| Fixes: f7d82350e597 ("tools/events: Add files to create libtraceevent.a") |
| Link: http://lkml.kernel.org/r/20190409091529.2686-1-rikard.falkeborn@gmail.com |
| Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com> |
| Signed-off-by: Ben Hutchings <ben@decadent.org.uk> |
| --- |
| tools/lib/traceevent/event-parse.c | 2 +- |
| 1 file changed, 1 insertion(+), 1 deletion(-) |
| |
| --- a/tools/lib/traceevent/event-parse.c |
| +++ b/tools/lib/traceevent/event-parse.c |
| @@ -2065,7 +2065,7 @@ eval_type_str(unsigned long long val, co |
| return val & 0xffffffff; |
| |
| if (strcmp(type, "u64") == 0 || |
| - strcmp(type, "s64")) |
| + strcmp(type, "s64") == 0) |
| return val; |
| |
| if (strcmp(type, "s8") == 0) |