From e22eb2d7b5078f78655e478dcee3a8298821edf3 Mon Sep 17 00:00:00 2001 From: Dominik Honnef Date: Thu, 19 Mar 2020 18:40:45 +0100 Subject: [PATCH] epkowa: fix parsing of interpreters (#82909) Building with -std=c99 breaks the obsolete "%as" format string, which completely breaks the parsing of epkowa interpreters. This means that no scanner requiring plugins worked. --- pkgs/misc/drivers/epkowa/default.nix | 1 + pkgs/misc/drivers/epkowa/sscanf.patch | 29 +++++++++++++++++++++++++++ 2 files changed, 30 insertions(+) create mode 100644 pkgs/misc/drivers/epkowa/sscanf.patch diff --git a/pkgs/misc/drivers/epkowa/default.nix b/pkgs/misc/drivers/epkowa/default.nix index 13bb63ca709..c8c0ecb872e 100644 --- a/pkgs/misc/drivers/epkowa/default.nix +++ b/pkgs/misc/drivers/epkowa/default.nix @@ -244,6 +244,7 @@ stdenv.mkDerivation rec { sha256 = "04y70qjd220dpyh771fiq50lha16pms98mfigwjczdfmx6kpj1jd"; }) ./firmware_location.patch + ./sscanf.patch ]; patchFlags = [ "-p0" ]; diff --git a/pkgs/misc/drivers/epkowa/sscanf.patch b/pkgs/misc/drivers/epkowa/sscanf.patch new file mode 100644 index 00000000000..7bee9cae518 --- /dev/null +++ b/pkgs/misc/drivers/epkowa/sscanf.patch @@ -0,0 +1,29 @@ +The "%as" verb requests sscanf to allocate a buffer for us. However, +this use of 'a' has been long deprecated, and gcc doesn't support it +in this manner when using -std=c99. The modern replacement is "%ms". + +Without this change, iscan couldn't read the interpreter file, in turn +breaking all scanners that require plugins. +--- backend/cfg-obj.c.orig 2020-03-19 01:27:17.254762077 +0100 ++++ backend/cfg-obj.c 2020-03-19 02:01:52.293329873 +0100 +@@ -1026,7 +1026,7 @@ + char *vendor = NULL; + char *model = NULL; + +- sscanf (string, "%*s %as %as", &vendor, &model); ++ sscanf (string, "%*s %ms %ms", &vendor, &model); + + if (list_append (_cfg->seen[CFG_KEY_SCSI], info)) + { +@@ -1108,10 +1112,10 @@ + char *library = NULL; + char *firmware = NULL; + +- sscanf (string, "%*s %*s %x %x %as %as", ++ sscanf (string, "%*s %*s %x %x %ms %ms", + &vendor, &product, &library, &firmware); + + if (library && _cfg_have_interpreter (library, firmware) + && list_append (_cfg->seen[CFG_KEY_INTERPRETER], info)) + { +