blob: 9ee428bd8da6d36b535db01c06ef273e66150d94 [file] [log] [blame]
From d3a6d69e9b0d765f4b0d9f9b108cb90c72417947 Mon Sep 17 00:00:00 2001
From: Jingkui Wang <jkwang@google.com>
Date: Wed, 6 Sep 2017 10:13:29 -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 | 57 +++++++++++++++++++++++++++++++++++++++++++++++++++++++--
1 file changed, 55 insertions(+), 2 deletions(-)
diff --git a/evtest.c b/evtest.c
index 2cf25f0..fa9df4a 100644
--- a/evtest.c
+++ b/evtest.c
@@ -98,6 +98,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)
@@ -595,6 +596,7 @@ 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
@@ -716,6 +718,10 @@ static int usage(void)
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");
@@ -733,7 +739,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);
@@ -823,6 +829,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.
*
@@ -851,13 +898,18 @@ static int print_events(int fd)
}
for (i = 0; i < rd / sizeof(struct input_event); i++) {
- 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 (ev[i].type == EV_SYN) {
if (ev[i].code == SYN_MT_REPORT)
printf("++++++++++++++ %s ++++++++++++\n", syns[ev[i].code]);
else
printf("-------------- %s ------------\n", syns[ev[i].code]);
+ } else if (safe_flag) {
+ safe_print_event(&ev[i]);
} else {
printf("type %d (%s), code %d (%s), ",
ev[i].type,
@@ -1034,6 +1086,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.14.1.581.gf28d330327-goog