| From 218cc1e499c93d4bcd1deda3821a303db72da304 Mon Sep 17 00:00:00 2001 |
| From: Harry Cutts <hcutts@chromium.org> |
| Date: Tue, 11 Aug 2020 14:56:58 -0700 |
| Subject: [PATCH] Enable safe mode for evtest |
| |
| This patch enables --safe for evtest. When evtest is called with --safe, |
| all the sensitive event info will be hidden. |
| --- |
| evtest.c | 59 +++++++++++++++++++++++++++++++++++++++++++++++++++++--- |
| 1 file changed, 56 insertions(+), 3 deletions(-) |
| |
| diff --git a/evtest.c b/evtest.c |
| index 37d4f85..dc79baf 100644 |
| --- a/evtest.c |
| +++ b/evtest.c |
| @@ -105,6 +105,7 @@ static const struct query_mode { |
| }; |
| |
| static int grab_flag = 0; |
| +static int safe_flag = 0; |
| static volatile sig_atomic_t stop = 0; |
| |
| static void interrupt_handler(int sig) |
| @@ -814,6 +815,8 @@ static const char * const * const names[EV_MAX + 1] = { |
| [EV_FF] = force, [EV_FF_STATUS] = forcestatus, |
| }; |
| |
| +static int cached_absinfo[ABS_MAX][6] = {0}; |
| + |
| /** |
| * Convert a string to a specific key/snd/led/sw code. The string can either |
| * be the name of the key in question (e.g. "SW_DOCK") or the numerical |
| @@ -941,7 +944,10 @@ static int usage(void) |
| printf(" Query mode: (check exit code)\n"); |
| printf(" %s --query /dev/input/eventX <type> <value>\n", |
| program_invocation_short_name); |
| - |
| + printf("\n"); |
| + printf(" Safe mode:\n"); |
| + printf(" %s --safe\n", program_invocation_short_name); |
| + printf(" --safe hide sensitive event information\n"); |
| printf("\n"); |
| printf("<type> is one of: EV_KEY, EV_SW, EV_LED, EV_SND\n"); |
| printf("<value> can either be a numerical value, or the textual name of the\n"); |
| @@ -959,7 +965,7 @@ static int usage(void) |
| */ |
| static void print_absdata(int fd, int axis) |
| { |
| - int abs[6] = {0}; |
| + int* abs = cached_absinfo[axis]; |
| int k; |
| |
| ioctl(fd, EVIOCGABS(axis), abs); |
| @@ -1106,6 +1112,47 @@ static int print_device_info(int fd) |
| return 0; |
| } |
| |
| +/** |
| + * Print event safely and do not print any sensitive infomation. |
| + * |
| + * @param ev The event to print. |
| + */ |
| +static void safe_print_event(struct input_event* ev) { |
| + const char* type_str = events[ev->type] ? events[ev->type] : "?"; |
| + const char* code_str = |
| + names[ev->type] ? (names[ev->type][ev->code] ? |
| + names[ev->type][ev->code] : "?") : "?"; |
| + printf("type %d (%s)", ev->type, type_str); |
| + switch (ev->type) { |
| + case EV_KEY: |
| + printf(", code *, value %d\n", ev->value); |
| + break; |
| + case EV_REL: |
| + printf(", code %d (%s)\n", ev->code, code_str); |
| + break; |
| + case EV_ABS: |
| + printf(", code %d (%s), ", ev->code, code_str); |
| + if (ev->value == cached_absinfo[ev->code][1]) |
| + printf("%s\n", "value = abs_min"); |
| + else if (ev->value == cached_absinfo[ev->code][2]) |
| + printf("%s\n", "value = abs_max"); |
| + else if (ev->value > cached_absinfo[ev->code][2] && |
| + ev->value < cached_absinfo[ev->code][1]) |
| + printf("%s\n", "value out of range (min, max)"); |
| + else |
| + printf("%s\n", "value in range (min, max)"); |
| + break; |
| + case EV_MSC: |
| + if (ev->code == MSC_TIMESTAMP) |
| + printf(", code %d (%s), value %s\n", ev->code, |
| + code_str, ev->value ? "non-zero" : "0"); |
| + else |
| + printf(", code %d (%s)\n", ev->code, code_str); |
| + default: |
| + break; |
| + } |
| +} |
| + |
| /** |
| * Print device events as they come in. |
| * |
| @@ -1139,7 +1186,10 @@ static int print_events(int fd) |
| type = ev[i].type; |
| code = ev[i].code; |
| |
| - printf("Event: time %ld.%06ld, ", ev[i].time.tv_sec, ev[i].time.tv_usec); |
| + if (safe_flag) |
| + printf("Event: time %ld, ", ev[i].time.tv_sec); |
| + else |
| + printf("Event: time %ld.%06ld, ", ev[i].time.tv_sec, ev[i].time.tv_usec); |
| |
| if (type == EV_SYN) { |
| if (code == SYN_MT_REPORT) |
| @@ -1148,6 +1198,8 @@ static int print_events(int fd) |
| printf(">>>>>>>>>>>>>> %s <<<<<<<<<<<<\n", codename(type, code)); |
| else |
| printf("-------------- %s ------------\n", codename(type, code)); |
| + } else if (safe_flag) { |
| + safe_print_event(&ev[i]); |
| } else { |
| printf("type %d (%s), code %d (%s), ", |
| type, typename(type), |
| @@ -1329,6 +1381,7 @@ static int do_query(const char *device, const char *event_type, const char *keyn |
| static const struct option long_options[] = { |
| { "grab", no_argument, &grab_flag, 1 }, |
| { "query", no_argument, NULL, MODE_QUERY }, |
| + { "safe", no_argument, &safe_flag, 1 }, |
| { "version", no_argument, NULL, MODE_VERSION }, |
| { 0, }, |
| }; |
| -- |
| 2.28.0.236.gb10cc79966-goog |
| |