[igt-dev] [PATCH i-g-t] cve: Add checker for cve-2019-0155
Chris Wilson
chris at chris-wilson.co.uk
Thu Nov 21 15:29:49 UTC 2019
Quoting Mika Kuoppala (2019-11-21 15:19:30)
> +static int is_platform_gen9(void)
> +{
> + const char * const id_file =
> + "/sys/bus/pci/drivers/i915/0000:00:02.0/device";
I still suggest we use I915_PARAM_CHIPSET_ID to avoid reliance on sysfs
here.
> + char idstr[32] = {0, };
> + uint32_t id = 0;
> + int fd, ret, i;
> +
> + fd = open(id_file, O_RDONLY);
> + if (fd == -1)
> + return -1;
> +
> + ret = read(fd, idstr, 6);
> + if (ret != 6)
> + return -1;
> +
> + close(fd);
> +
> + idstr[6] = 0;
> +
> + id = strtol(idstr, NULL, 16);
> +
> + for (i = 0; i < sizeof(gen9_ids)/sizeof(uint32_t); i++)
sizeof(gen9_ids) / sizeof(gen9_ids[0])
> + if (id == gen9_ids[i])
> + return 1;
> +
> + return 0;
> +}
> +
> +static int is_fd_safe(const int fd)
> +{
> + int parser_version = -1;
> + int write_block = 0;
> +
> + parser_version = cmd_parser_version(fd);
> + printf(" Command parser version: %d\n", parser_version);
> + if (parser_version >= 10) {
> + printf(" Command parsing for blt engine supported\n");
> + } else if (!CHECK_WRITE_BLOCK_WITHOUT_PARSER) {
> + printf(" There is no blitter command parser\n");
> + return 0;
> + }
> +
> + write_block = is_write_blocked(fd);
> +
> + printf(" Unsafe write %s\n", write_block ? "blocked" : "possible!");
> +
> + return write_block;
> +}
> +
> +struct stats {
> + int checked;
> + int safe;
> + int failed;
> +};
> +
> +static void check_path(const char *path, struct stats *stats)
> +{
> + int fd;
> + int is_safe;
> +
> + fd = open(path, O_RDWR);
> + if (fd == -1) {
> + if (errno != ENOENT) {
> + printf("Opening %s failed with %s (%d)\n",
> + path, strerror(errno), errno);
> + stats->failed++;
> + }
> +
> + return;
> + }
> +
> + if (!is_driver_i915(fd)) {
> + close(fd);
> + return;
> + }
> +
> + printf("Checking %s:\n", path);
> +
> + is_safe = is_fd_safe(fd);
> + printf(" Device %s : %s\n\n", path, is_safe ? "SAFE" : "VULNERABLE");
> + if (is_safe)
> + stats->safe++;
I would go through and do a pass of errors => stderr, and suppressing
anything else that is not "SAFE" vs "UNSAFE" (usual #define DBG tricks)
-Chris
More information about the igt-dev
mailing list