b963450
From 886208261b5b91b4a64efd8a203873ab85a07a2e Mon Sep 17 00:00:00 2001
6ef393b
From: Nils Philippsen <nils@redhat.com>
6ef393b
Date: Thu, 7 Nov 2013 12:48:23 +0100
6ef393b
Subject: [PATCH] patch: static-code-check
6ef393b
6ef393b
Fix problems found during static code check (Coverity).
6ef393b
6ef393b
Squashed commit of the following:
6ef393b
b963450
commit e24cea3bceb5dad2042dcd95f582d6c8acf4c9ee
b963450
Author: Nils Philippsen <nils@redhat.com>
b963450
Date:   Thu Nov 7 14:29:28 2013 +0100
b963450
b963450
    epson: don't leak memory if realloc() fails
b963450
b963450
    (cherry picked from commit d835d9d565118d52c2339c2e79890f57d0616077)
b963450
6ef393b
commit b0c14b86210c7615ea4d90723722a7430b175ae2
6ef393b
Author: Nils Philippsen <nils@redhat.com>
6ef393b
Date:   Wed Nov 6 11:05:58 2013 +0100
6ef393b
6ef393b
    genesys: check return values
6ef393b
6ef393b
    (cherry picked from commit dc76e7cce464f04e46aab2bb0c269b4742161c59)
6ef393b
6ef393b
commit b6e13be1c187790adfa50e81506533fbe21dca6f
6ef393b
Author: Nils Philippsen <nils@redhat.com>
6ef393b
Date:   Tue Nov 5 14:48:09 2013 +0100
6ef393b
6ef393b
    genesys: remove code which is never reached
6ef393b
6ef393b
    The surrounding conditions always evaluate as FALSE because the
6ef393b
    variables are set to different values before.
6ef393b
6ef393b
    (cherry picked from commit 5d7f7ffefb22e7e64789e97af0356b7859d61814)
6ef393b
6ef393b
commit 6d77e6f1ebb9eb0f47117a5790486a3b83c142d2
6ef393b
Author: Nils Philippsen <nils@redhat.com>
6ef393b
Date:   Wed Nov 6 11:44:16 2013 +0100
6ef393b
6ef393b
    rts8891: check return values
6ef393b
6ef393b
    (cherry picked from commit 602d6ecdfe5f3146867799fabf3ac87582c26461)
6ef393b
6ef393b
commit 0438b3f9aaa4ee8558185ad5e7a9c6a0bf1a3590
6ef393b
Author: Nils Philippsen <nils@redhat.com>
6ef393b
Date:   Tue Nov 5 15:42:26 2013 +0100
6ef393b
6ef393b
    genesys: compute MAX_SCANNERS from array length
6ef393b
6ef393b
    ... of genesys_usb_device_list[]
6ef393b
6ef393b
    (cherry picked from commit a3fe2c1ea5b4f6b1e55435f6abc44f402ff32b4d)
6ef393b
6ef393b
commit ba746cc2a62cfb32ae6f8e22d6d36206959b7128
6ef393b
Author: Nils Philippsen <nils@redhat.com>
6ef393b
Date:   Tue Nov 5 15:31:11 2013 +0100
6ef393b
6ef393b
    kodakio: don't overrun option name array
6ef393b
6ef393b
    (cherry picked from commit 2d89e37f365cb8e54ee44aa686a62320e2837b50)
6ef393b
6ef393b
commit 87580bc5d07f983afa1db1e0e7c36287b85b5ecd
6ef393b
Author: Nils Philippsen <nils@redhat.com>
6ef393b
Date:   Tue Nov 5 15:19:48 2013 +0100
6ef393b
6ef393b
    pixma: document falling through to next switch case
6ef393b
6ef393b
    (cherry picked from commit 101f76c516cd42cafe9e142aefe751094a125e73)
6ef393b
6ef393b
commit 15f7322b94a1e895d6ab6e8fb0466ef920a946ad
6ef393b
Author: Nils Philippsen <nils@redhat.com>
6ef393b
Date:   Tue Nov 5 15:15:17 2013 +0100
6ef393b
6ef393b
    genesys: avoid infinite loop
6ef393b
6ef393b
    The stray semicolon prevents executing the loop which could reset the
6ef393b
    REG41_FEBUSY bit.
6ef393b
6ef393b
    (cherry picked from commit b53a58c4b534b9e6897c1b0a6301d2bf76dc3499)
6ef393b
6ef393b
commit bde7ee0c9e0bde21fc8b01af11270ca51110a89d
6ef393b
Author: Nils Philippsen <nils@redhat.com>
6ef393b
Date:   Tue Nov 5 15:12:20 2013 +0100
6ef393b
6ef393b
    pixma: avoid buffer overflows
6ef393b
6ef393b
    (cherry picked from commit 575f40a0790bb5e20ffd7ccae1c9272e481bbe51)
6ef393b
6ef393b
commit ee3953fb5b11a26a42bee3d75ee6b93da0bb112f
6ef393b
Author: Nils Philippsen <nils@redhat.com>
6ef393b
Date:   Tue Nov 5 14:52:22 2013 +0100
6ef393b
6ef393b
    pixma: u32tohex(): shift first, then cast to uint8_t
6ef393b
6ef393b
    (cherry picked from commit cf9129d62fe7e84479e8daf6018cd2495d53bcc9)
6ef393b
6ef393b
commit ef85481800383cf082ad6aa4a944765ee84027c0
6ef393b
Author: Nils Philippsen <nils@redhat.com>
6ef393b
Date:   Tue Nov 5 14:47:27 2013 +0100
6ef393b
6ef393b
    remove code which is never reached
6ef393b
6ef393b
    (cherry picked from commit 66cb9b55c2e60503d537d7ed927f5a5aef3658d2)
6ef393b
6ef393b
commit 0864f4d6203ba8f1306af0d39a09dff2f9d4706a
6ef393b
Author: Nils Philippsen <nils@redhat.com>
6ef393b
Date:   Tue Nov 5 14:17:12 2013 +0100
6ef393b
6ef393b
    genesys: fix some memory leaks
6ef393b
6ef393b
    (cherry picked from commit 252ccdd926bb28bd6064da7b652e646664226572)
6ef393b
6ef393b
commit a4d72c0e2ebb1f6352f21a300bbff67d439cd77f
6ef393b
Author: Nils Philippsen <nils@redhat.com>
6ef393b
Date:   Tue Nov 5 13:56:28 2013 +0100
6ef393b
6ef393b
    epson: ensure that command() allocates enough memory
6ef393b
6ef393b
    (cherry picked from commit 8cd2d36f1e9a5b5633d4b8334acf5c8f68381415)
6ef393b
6ef393b
commit 67af3b80508c0a0adb0fe89ead7c4cb570d7400c
6ef393b
Author: Nils Philippsen <nils@redhat.com>
6ef393b
Date:   Tue Nov 5 11:39:56 2013 +0100
6ef393b
6ef393b
    genesys: avoid dereferencing null pointer
6ef393b
6ef393b
    (cherry picked from commit 56104b5329076d45caf2e04a2271f40a2699f71f)
6ef393b
---
b963450
 backend/epson.c           | 36 +++++++++++++++++++++----------
6ef393b
 backend/genesys.c         |  9 +++++---
6ef393b
 backend/genesys_devices.c |  3 +++
6ef393b
 backend/genesys_gl124.c   | 21 ++++++++++++++++--
6ef393b
 backend/genesys_gl843.c   | 20 +++++++++++++++--
6ef393b
 backend/genesys_gl846.c   | 55 ++++++++++++++++++++++++++---------------------
6ef393b
 backend/genesys_gl847.c   | 21 ++++++++++++++++--
6ef393b
 backend/genesys_low.h     |  1 -
6ef393b
 backend/kodakaio.c        |  6 +++---
6ef393b
 backend/pixma_bjnp.c      | 18 ++++++++++------
6ef393b
 backend/rts8891.c         | 16 ++++++--------
6ef393b
 sanei/sanei_usb.c         |  2 --
6ef393b
 tools/sane-find-scanner.c |  2 --
b963450
 13 files changed, 141 insertions(+), 69 deletions(-)
6ef393b
6ef393b
diff --git a/backend/epson.c b/backend/epson.c
b963450
index 2cae65a..3b063b9 100644
6ef393b
--- a/backend/epson.c
6ef393b
+++ b/backend/epson.c
6ef393b
@@ -818,6 +818,12 @@ typedef struct
6ef393b
 
6ef393b
 } EpsonIdentRec, *EpsonIdent;
6ef393b
 
6ef393b
+typedef union
6ef393b
+{
6ef393b
+  EpsonHdrRec hdr;
6ef393b
+  EpsonIdentRec ident;
6ef393b
+} EpsonHdrUnionRec, *EpsonHdrUnion;
6ef393b
+
6ef393b
 
6ef393b
 typedef struct
6ef393b
 {
6ef393b
@@ -843,7 +849,7 @@ typedef struct
6ef393b
  *
6ef393b
  */
6ef393b
 
6ef393b
-static EpsonHdr command (Epson_Scanner * s, u_char * cmd, size_t cmd_size,
6ef393b
+static EpsonHdrUnion command (Epson_Scanner * s, u_char * cmd, size_t cmd_size,
6ef393b
                          SANE_Status * status);
6ef393b
 static SANE_Status get_identity_information (SANE_Handle handle);
6ef393b
 static SANE_Status get_identity2_information (SANE_Handle handle);
6ef393b
@@ -1844,21 +1850,24 @@ static Epson_Device *first_dev = NULL;  /* first EPSON scanner in list */
6ef393b
 static Epson_Scanner *first_handle = NULL;
6ef393b
 
6ef393b
 
6ef393b
-static EpsonHdr
6ef393b
+static EpsonHdrUnion
6ef393b
 command (Epson_Scanner * s, u_char * cmd, size_t cmd_size,
6ef393b
          SANE_Status * status)
6ef393b
 {
b963450
+  EpsonHdrUnion hdrunion, hdrunion_bak;
6ef393b
   EpsonHdr head;
6ef393b
   u_char *buf;
6ef393b
   int count;
6ef393b
 
6ef393b
-  if (NULL == (head = walloc (EpsonHdrRec)))
6ef393b
+  if (NULL == (hdrunion = walloc (EpsonHdrUnionRec)))
6ef393b
   {
6ef393b
     DBG (1, "out of memory (line %d)\n", __LINE__);
6ef393b
     *status = SANE_STATUS_NO_MEM;
6ef393b
-    return (EpsonHdr) 0;
6ef393b
+    return (EpsonHdrUnion) 0;
6ef393b
   }
6ef393b
 
6ef393b
+  head = &(hdrunion->hdr);
6ef393b
+
6ef393b
   send (s, cmd, cmd_size, status);
6ef393b
 
6ef393b
   if (SANE_STATUS_GOOD != *status)
6ef393b
@@ -1869,7 +1878,7 @@ command (Epson_Scanner * s, u_char * cmd, size_t cmd_size,
6ef393b
     *status = SANE_STATUS_GOOD;
6ef393b
     send (s, cmd, cmd_size, status);
6ef393b
     if (SANE_STATUS_GOOD != *status)
6ef393b
-      return (EpsonHdr) 0;
6ef393b
+      return (EpsonHdrUnion) 0;
6ef393b
   }
6ef393b
 
6ef393b
   buf = (u_char *) head;
6ef393b
@@ -1892,7 +1901,7 @@ command (Epson_Scanner * s, u_char * cmd, size_t cmd_size,
6ef393b
   }
6ef393b
 
6ef393b
   if (SANE_STATUS_GOOD != *status)
6ef393b
-    return (EpsonHdr) 0;
6ef393b
+    return (EpsonHdrUnion) 0;
6ef393b
 
6ef393b
   DBG (4, "code   %02x\n", (int) head->code);
6ef393b
 
b963450
@@ -1921,25 +1930,30 @@ command (Epson_Scanner * s, u_char * cmd, size_t cmd_size,
6ef393b
     }
6ef393b
 
6ef393b
     if (SANE_STATUS_GOOD != *status)
6ef393b
-      return (EpsonHdr) 0;
6ef393b
+      return (EpsonHdrUnion) 0;
6ef393b
 
6ef393b
     DBG (4, "status %02x\n", (int) head->status);
6ef393b
 
6ef393b
     count = head->count2 * 255 + head->count1;
6ef393b
     DBG (4, "count  %d\n", count);
6ef393b
 
6ef393b
-    if (NULL == (head = realloc (head, sizeof (EpsonHdrRec) + count)))
b963450
+    hdrunion_bak = hdrunion;
6ef393b
+    if (NULL == (hdrunion = realloc (hdrunion,
6ef393b
+            sizeof (EpsonHdrUnionRec) + count)))
6ef393b
     {
b963450
+      free(hdrunion_bak);
6ef393b
       DBG (1, "out of memory (line %d)\n", __LINE__);
6ef393b
       *status = SANE_STATUS_NO_MEM;
6ef393b
-      return (EpsonHdr) 0;
6ef393b
+      return (EpsonHdrUnion) 0;
6ef393b
     }
6ef393b
 
6ef393b
+    head = &(hdrunion->hdr);
6ef393b
+
6ef393b
     buf = head->buf;
6ef393b
     receive (s, buf, count, status);
6ef393b
 
6ef393b
     if (SANE_STATUS_GOOD != *status)
6ef393b
-      return (EpsonHdr) 0;
6ef393b
+      return (EpsonHdrUnion) 0;
6ef393b
 
6ef393b
     break;
6ef393b
 
b963450
@@ -1953,7 +1967,7 @@ command (Epson_Scanner * s, u_char * cmd, size_t cmd_size,
6ef393b
     break;
6ef393b
   }
6ef393b
 
6ef393b
-  return head;
6ef393b
+  return hdrunion;
6ef393b
 }
6ef393b
 
6ef393b
 
6ef393b
diff --git a/backend/genesys.c b/backend/genesys.c
6ef393b
index 6e7caad..e2c92e7 100644
6ef393b
--- a/backend/genesys.c
6ef393b
+++ b/backend/genesys.c
6ef393b
@@ -5977,7 +5977,7 @@ attach (SANE_String_Const devname, Genesys_Device ** devp, SANE_Bool may_wait)
6ef393b
   Genesys_Device *dev = 0;
6ef393b
   SANE_Int dn, vendor, product;
6ef393b
   SANE_Status status;
6ef393b
-  int i;
6ef393b
+  unsigned int i;
6ef393b
 
6ef393b
 
6ef393b
   DBG (DBG_proc, "attach: start: devp %s NULL, may_wait = %d\n",
6ef393b
@@ -6061,7 +6061,10 @@ attach (SANE_String_Const devname, Genesys_Device ** devp, SANE_Bool may_wait)
6ef393b
 
6ef393b
   dev->file_name = strdup (devname);
6ef393b
   if (!dev->file_name)
6ef393b
-    return SANE_STATUS_NO_MEM;
6ef393b
+    {
6ef393b
+      free(dev);
6ef393b
+      return SANE_STATUS_NO_MEM;
6ef393b
+    }
6ef393b
 
6ef393b
   dev->model = genesys_usb_device_list[i].model;
6ef393b
   dev->vendorId = genesys_usb_device_list[i].vendor;
6ef393b
@@ -6630,7 +6633,7 @@ sane_get_devices (const SANE_Device *** device_list, SANE_Bool local_only)
6ef393b
 		  first_dev = dev->next;
6ef393b
 		  num_devices--;
6ef393b
 		  free (dev);
6ef393b
-	          dev = prev->next;
6ef393b
+	          dev = first_dev;
6ef393b
 		}
6ef393b
 	    }
6ef393b
 	  /* case 2 : removed device is not first_dev */
6ef393b
diff --git a/backend/genesys_devices.c b/backend/genesys_devices.c
6ef393b
index fb3cd43..462c4a9 100644
6ef393b
--- a/backend/genesys_devices.c
6ef393b
+++ b/backend/genesys_devices.c
6ef393b
@@ -3413,3 +3413,6 @@ static Genesys_USB_Device_Entry genesys_usb_device_list[] = {
6ef393b
   {0x04a9, 0x190a, &canon_lide_210_model},
6ef393b
   {0, 0, NULL}
6ef393b
 };
6ef393b
+
6ef393b
+#define MAX_SCANNERS (sizeof(genesys_usb_device_list) / \
6ef393b
+        sizeof(genesys_usb_device_list[0]))
6ef393b
diff --git a/backend/genesys_gl124.c b/backend/genesys_gl124.c
6ef393b
index 9e2fb8a..4a4b642 100644
6ef393b
--- a/backend/genesys_gl124.c
6ef393b
+++ b/backend/genesys_gl124.c
6ef393b
@@ -2246,7 +2246,7 @@ gl124_slow_back_home (Genesys_Device * dev, SANE_Bool wait_until_home)
6ef393b
   /* TODO add scan_mode to the API */
6ef393b
   scan_mode= dev->settings.scan_mode;
6ef393b
   dev->settings.scan_mode=SCAN_MODE_GRAY;
6ef393b
-  gl124_init_scan_regs (dev,
6ef393b
+  status = gl124_init_scan_regs (dev,
6ef393b
 			local_reg,
6ef393b
 			resolution,
6ef393b
 			resolution,
6ef393b
@@ -2260,6 +2260,15 @@ gl124_slow_back_home (Genesys_Device * dev, SANE_Bool wait_until_home)
6ef393b
 			SCAN_FLAG_DISABLE_SHADING |
6ef393b
 			SCAN_FLAG_DISABLE_GAMMA |
6ef393b
 			SCAN_FLAG_IGNORE_LINE_DISTANCE);
6ef393b
+  if (status != SANE_STATUS_GOOD)
6ef393b
+    {
6ef393b
+      DBG (DBG_error,
6ef393b
+           "gl124_slow_back_home: failed to set up registers: %s\n",
6ef393b
+           sane_strstatus (status));
6ef393b
+      DBGCOMPLETED;
6ef393b
+      return status;
6ef393b
+    }
6ef393b
+
6ef393b
   dev->settings.scan_mode=scan_mode;
6ef393b
 
6ef393b
   /* clear scan and feed count */
6ef393b
@@ -2348,7 +2357,7 @@ gl124_feed (Genesys_Device * dev, unsigned int steps)
6ef393b
   memcpy (local_reg, dev->reg, GENESYS_GL124_MAX_REGS * sizeof (Genesys_Register_Set));
6ef393b
 
6ef393b
   resolution=sanei_genesys_get_lowest_ydpi(dev);
6ef393b
-  gl124_init_scan_regs (dev,
6ef393b
+  status = gl124_init_scan_regs (dev,
6ef393b
 			local_reg,
6ef393b
 			resolution,
6ef393b
 			resolution,
6ef393b
@@ -2364,6 +2373,14 @@ gl124_feed (Genesys_Device * dev, unsigned int steps)
6ef393b
                         SCAN_FLAG_FEEDING |
6ef393b
 			SCAN_FLAG_DISABLE_BUFFER_FULL_MOVE |
6ef393b
 			SCAN_FLAG_IGNORE_LINE_DISTANCE);
6ef393b
+  if (status != SANE_STATUS_GOOD)
6ef393b
+    {
6ef393b
+      DBG (DBG_error,
6ef393b
+           "gl124_feed: failed to set up registers: %s\n",
6ef393b
+           sane_strstatus (status));
6ef393b
+      DBGCOMPLETED;
6ef393b
+      return status;
6ef393b
+    }
6ef393b
 
6ef393b
   /* set exposure to zero */
6ef393b
   sanei_genesys_set_triple(local_reg,REG_EXPR,0);
6ef393b
diff --git a/backend/genesys_gl843.c b/backend/genesys_gl843.c
6ef393b
index 3648d09..6cddd4f 100644
6ef393b
--- a/backend/genesys_gl843.c
6ef393b
+++ b/backend/genesys_gl843.c
6ef393b
@@ -2591,7 +2591,7 @@ gl843_slow_back_home (Genesys_Device * dev, SANE_Bool wait_until_home)
6ef393b
   memcpy (local_reg, dev->reg, GENESYS_GL843_MAX_REGS * sizeof (Genesys_Register_Set));
6ef393b
   resolution=sanei_genesys_get_lowest_ydpi(dev);
6ef393b
 
6ef393b
-  gl843_init_scan_regs (dev,
6ef393b
+  status = gl843_init_scan_regs (dev,
6ef393b
 			local_reg,
6ef393b
 			resolution,
6ef393b
 			resolution,
6ef393b
@@ -2607,6 +2607,14 @@ gl843_slow_back_home (Genesys_Device * dev, SANE_Bool wait_until_home)
6ef393b
 			SCAN_FLAG_DISABLE_GAMMA |
6ef393b
 			SCAN_FLAG_DISABLE_BUFFER_FULL_MOVE |
6ef393b
 			SCAN_FLAG_IGNORE_LINE_DISTANCE);
6ef393b
+  if (status != SANE_STATUS_GOOD)
6ef393b
+    {
6ef393b
+      DBG (DBG_error,
6ef393b
+           "gl843_slow_back_home: failed to set up registers: %s\n",
6ef393b
+           sane_strstatus (status));
6ef393b
+      DBGCOMPLETED;
6ef393b
+      return status;
6ef393b
+    }
6ef393b
 
6ef393b
   /* clear scan and feed count */
6ef393b
   RIE (sanei_genesys_write_register (dev, REG0D, REG0D_CLRLNCNT | REG0D_CLRMCNT));
6ef393b
@@ -2879,7 +2887,7 @@ gl843_feed (Genesys_Device * dev, unsigned int steps)
6ef393b
   memcpy (local_reg, dev->reg, GENESYS_GL843_MAX_REGS * sizeof (Genesys_Register_Set));
6ef393b
 
6ef393b
   resolution=sanei_genesys_get_lowest_ydpi(dev);
6ef393b
-  gl843_init_scan_regs (dev,
6ef393b
+  status = gl843_init_scan_regs (dev,
6ef393b
 			local_reg,
6ef393b
 			resolution,
6ef393b
 			resolution,
6ef393b
@@ -2895,6 +2903,14 @@ gl843_feed (Genesys_Device * dev, unsigned int steps)
6ef393b
 			SCAN_FLAG_DISABLE_GAMMA |
6ef393b
                         SCAN_FLAG_FEEDING |
6ef393b
 			SCAN_FLAG_IGNORE_LINE_DISTANCE);
6ef393b
+  if (status != SANE_STATUS_GOOD)
6ef393b
+    {
6ef393b
+      DBG (DBG_error,
6ef393b
+           "gl843_feed: failed to set up registers: %s\n",
6ef393b
+           sane_strstatus (status));
6ef393b
+      DBGCOMPLETED;
6ef393b
+      return status;
6ef393b
+    }
6ef393b
 
6ef393b
   /* clear scan and feed count */
6ef393b
   RIE (sanei_genesys_write_register (dev, REG0D, REG0D_CLRLNCNT));
6ef393b
diff --git a/backend/genesys_gl846.c b/backend/genesys_gl846.c
6ef393b
index 5e1f0f4..c810604 100644
6ef393b
--- a/backend/genesys_gl846.c
6ef393b
+++ b/backend/genesys_gl846.c
6ef393b
@@ -633,7 +633,7 @@ gl846_set_adi_fe (Genesys_Device * dev, uint8_t set)
6ef393b
 
6ef393b
   /* wait for FE to be ready */
6ef393b
   status = sanei_genesys_get_status (dev, &val8);
6ef393b
-  while (val8 & REG41_FEBUSY);
6ef393b
+  while (val8 & REG41_FEBUSY)
6ef393b
     {
6ef393b
       usleep (10000);
6ef393b
       status = sanei_genesys_get_status (dev, &val8);
6ef393b
@@ -1975,7 +1975,7 @@ gl846_slow_back_home (Genesys_Device * dev, SANE_Bool wait_until_home)
6ef393b
   /* TODO add scan_mode to the API */
6ef393b
   scan_mode= dev->settings.scan_mode;
6ef393b
   dev->settings.scan_mode=SCAN_MODE_LINEART;
6ef393b
-  gl846_init_scan_regs (dev,
6ef393b
+  status = gl846_init_scan_regs (dev,
6ef393b
 			local_reg,
6ef393b
 			resolution,
6ef393b
 			resolution,
6ef393b
@@ -1989,6 +1989,14 @@ gl846_slow_back_home (Genesys_Device * dev, SANE_Bool wait_until_home)
6ef393b
 			SCAN_FLAG_DISABLE_SHADING |
6ef393b
 			SCAN_FLAG_DISABLE_GAMMA |
6ef393b
 			SCAN_FLAG_IGNORE_LINE_DISTANCE);
6ef393b
+  if (status != SANE_STATUS_GOOD)
6ef393b
+    {
6ef393b
+      DBG (DBG_error,
6ef393b
+           "gl846_slow_back_home: failed to set up registers: %s\n",
6ef393b
+           sane_strstatus (status));
6ef393b
+      DBGCOMPLETED;
6ef393b
+      return status;
6ef393b
+    }
6ef393b
   dev->settings.scan_mode=scan_mode;
6ef393b
 
6ef393b
   /* clear scan and feed count */
6ef393b
@@ -2255,7 +2263,7 @@ gl846_feed (Genesys_Device * dev, unsigned int steps)
6ef393b
   memcpy (local_reg, dev->reg, GENESYS_GL846_MAX_REGS * sizeof (Genesys_Register_Set));
6ef393b
 
6ef393b
   resolution=sanei_genesys_get_lowest_ydpi(dev);
6ef393b
-  gl846_init_scan_regs (dev,
6ef393b
+  status = gl846_init_scan_regs (dev,
6ef393b
 			local_reg,
6ef393b
 			resolution,
6ef393b
 			resolution,
6ef393b
@@ -2270,6 +2278,14 @@ gl846_feed (Genesys_Device * dev, unsigned int steps)
6ef393b
 			SCAN_FLAG_DISABLE_GAMMA |
6ef393b
                         SCAN_FLAG_FEEDING |
6ef393b
 			SCAN_FLAG_IGNORE_LINE_DISTANCE);
6ef393b
+  if (status != SANE_STATUS_GOOD)
6ef393b
+    {
6ef393b
+      DBG (DBG_error,
6ef393b
+           "gl846_feed: failed to set up registers: %s\n",
6ef393b
+           sane_strstatus (status));
6ef393b
+      DBGCOMPLETED;
6ef393b
+      return status;
6ef393b
+    }
6ef393b
 
6ef393b
   /* set exposure to zero */
6ef393b
   sanei_genesys_set_triple(local_reg,REG_EXPR,0);
6ef393b
@@ -2583,13 +2599,14 @@ gl846_send_shading_data (Genesys_Device * dev, uint8_t * data, int size)
6ef393b
           ptr+=4;
6ef393b
         }
6ef393b
 
6ef393b
-      RIE (sanei_genesys_read_register (dev, 0xd0+i, &val));
6ef393b
+      RIEF (sanei_genesys_read_register (dev, 0xd0+i, &val), buffer);
6ef393b
       addr = val * 8192 + 0x10000000;
6ef393b
       status = sanei_genesys_write_ahb (dev->dn, dev->usb_mode, addr, pixels, buffer);
6ef393b
       if (status != SANE_STATUS_GOOD)
6ef393b
         {
6ef393b
           DBG (DBG_error, "gl846_send_shading_data; write to AHB failed (%s)\n",
6ef393b
 	      sane_strstatus (status));
6ef393b
+          free(buffer);
6ef393b
           return status;
6ef393b
         }
6ef393b
     }
6ef393b
@@ -3013,7 +3030,15 @@ gl846_search_strip (Genesys_Device * dev, SANE_Bool forward, SANE_Bool black)
6ef393b
   DBG (DBG_proc, "gl846_search_strip %s %s\n", black ? "black" : "white",
6ef393b
        forward ? "forward" : "reverse");
6ef393b
 
6ef393b
-  gl846_set_fe (dev, AFE_SET);
6ef393b
+  status = gl846_set_fe (dev, AFE_SET);
6ef393b
+  if (status != SANE_STATUS_GOOD)
6ef393b
+    {
6ef393b
+      DBG (DBG_error,
6ef393b
+           "gl846_search_strip: gl846_set_fe() failed: %s\n",
6ef393b
+           sane_strstatus(status));
6ef393b
+      return status;
6ef393b
+    }
6ef393b
+
6ef393b
   status = gl846_stop_action (dev);
6ef393b
   if (status != SANE_STATUS_GOOD)
6ef393b
     {
6ef393b
@@ -3572,24 +3597,10 @@ gl846_coarse_gain_calibration (Genesys_Device * dev, int dpi)
6ef393b
       max[j] = 0;
6ef393b
       for (i = pixels/4; i < (pixels*3/4); i++)
6ef393b
 	{
6ef393b
-          if(bpp==16)
6ef393b
-            {
6ef393b
-	  if (dev->model->is_cis)
6ef393b
-	    val =
6ef393b
-	      line[i * 2 + j * 2 * pixels + 1] * 256 +
6ef393b
-	      line[i * 2 + j * 2 * pixels];
6ef393b
-	  else
6ef393b
-	    val =
6ef393b
-	      line[i * 2 * channels + 2 * j + 1] * 256 +
6ef393b
-	      line[i * 2 * channels + 2 * j];
6ef393b
-            }
6ef393b
-          else
6ef393b
-            {
6ef393b
 	  if (dev->model->is_cis)
6ef393b
 	    val = line[i + j * pixels];
6ef393b
 	  else
6ef393b
 	    val = line[i * channels + j];
6ef393b
-            }
6ef393b
 
6ef393b
 	    max[j] += val;
6ef393b
 	}
6ef393b
@@ -3619,12 +3630,6 @@ gl846_coarse_gain_calibration (Genesys_Device * dev, int dpi)
6ef393b
       dev->frontend.gain[2] = dev->frontend.gain[1] = dev->frontend.gain[0];
6ef393b
     }
6ef393b
 
6ef393b
-  if (channels == 1)
6ef393b
-    {
6ef393b
-      dev->frontend.gain[0] = dev->frontend.gain[1];
6ef393b
-      dev->frontend.gain[2] = dev->frontend.gain[1];
6ef393b
-    }
6ef393b
-
6ef393b
   free (line);
6ef393b
 
6ef393b
   RIE (gl846_stop_action (dev));
6ef393b
diff --git a/backend/genesys_gl847.c b/backend/genesys_gl847.c
6ef393b
index 7c6a3c3..47171b9 100644
6ef393b
--- a/backend/genesys_gl847.c
6ef393b
+++ b/backend/genesys_gl847.c
6ef393b
@@ -1995,7 +1995,7 @@ gl847_slow_back_home (Genesys_Device * dev, SANE_Bool wait_until_home)
6ef393b
   /* TODO add scan_mode to the API */
6ef393b
   scan_mode= dev->settings.scan_mode;
6ef393b
   dev->settings.scan_mode=SCAN_MODE_LINEART;
6ef393b
-  gl847_init_scan_regs (dev,
6ef393b
+  status = gl847_init_scan_regs (dev,
6ef393b
 			local_reg,
6ef393b
 			resolution,
6ef393b
 			resolution,
6ef393b
@@ -2009,6 +2009,15 @@ gl847_slow_back_home (Genesys_Device * dev, SANE_Bool wait_until_home)
6ef393b
 			SCAN_FLAG_DISABLE_SHADING |
6ef393b
 			SCAN_FLAG_DISABLE_GAMMA |
6ef393b
 			SCAN_FLAG_IGNORE_LINE_DISTANCE);
6ef393b
+  if (status != SANE_STATUS_GOOD)
6ef393b
+    {
6ef393b
+      DBG (DBG_error,
6ef393b
+           "gl847_slow_back_home: failed to set up registers: %s\n",
6ef393b
+           sane_strstatus (status));
6ef393b
+      DBGCOMPLETED;
6ef393b
+      return status;
6ef393b
+    }
6ef393b
+
6ef393b
   dev->settings.scan_mode=scan_mode;
6ef393b
 
6ef393b
   /* clear scan and feed count */
6ef393b
@@ -2276,7 +2285,7 @@ gl847_feed (Genesys_Device * dev, unsigned int steps)
6ef393b
   memcpy (local_reg, dev->reg, GENESYS_GL847_MAX_REGS * sizeof (Genesys_Register_Set));
6ef393b
 
6ef393b
   resolution=sanei_genesys_get_lowest_ydpi(dev);
6ef393b
-  gl847_init_scan_regs (dev,
6ef393b
+  status = gl847_init_scan_regs (dev,
6ef393b
 			local_reg,
6ef393b
 			resolution,
6ef393b
 			resolution,
6ef393b
@@ -2291,6 +2300,14 @@ gl847_feed (Genesys_Device * dev, unsigned int steps)
6ef393b
 			SCAN_FLAG_DISABLE_GAMMA |
6ef393b
                         SCAN_FLAG_FEEDING |
6ef393b
 			SCAN_FLAG_IGNORE_LINE_DISTANCE);
6ef393b
+  if (status != SANE_STATUS_GOOD)
6ef393b
+    {
6ef393b
+      DBG (DBG_error,
6ef393b
+           "gl847_feed: failed to set up registers: %s\n",
6ef393b
+           sane_strstatus (status));
6ef393b
+      DBGCOMPLETED;
6ef393b
+      return status;
6ef393b
+    }
6ef393b
 
6ef393b
   /* set exposure to zero */
6ef393b
   sanei_genesys_set_triple(local_reg,REG_EXPR,0);
6ef393b
diff --git a/backend/genesys_low.h b/backend/genesys_low.h
6ef393b
index 1d5ef22..31e0541 100644
6ef393b
--- a/backend/genesys_low.h
6ef393b
+++ b/backend/genesys_low.h
6ef393b
@@ -310,7 +310,6 @@ typedef enum Genesys_Color_Order
6ef393b
 Genesys_Color_Order;
6ef393b
 
6ef393b
 
6ef393b
-#define MAX_SCANNERS 50
6ef393b
 #define MAX_RESOLUTIONS 13
6ef393b
 #define MAX_DPI 4
6ef393b
 
6ef393b
diff --git a/backend/kodakaio.c b/backend/kodakaio.c
6ef393b
index 8c4583a..901f7a8 100644
6ef393b
--- a/backend/kodakaio.c
6ef393b
+++ b/backend/kodakaio.c
6ef393b
@@ -3131,14 +3131,14 @@ sane_control_option(SANE_Handle handle, SANE_Int option, SANE_Action action,
6ef393b
 		    void *value, SANE_Int *info)
6ef393b
 {
6ef393b
 	KodakAio_Scanner *s = (KodakAio_Scanner *) handle;
6ef393b
-	DBG(2, "%s: action = %x, option = %d %s\n", __func__, action, option, s->opt[option].name);
6ef393b
-
6ef393b
 	if (option < 0 || option >= NUM_OPTIONS)
6ef393b
 	{
6ef393b
-		DBG(1, "%s: option num = %d (%s) out of range\n", __func__, option, s->opt[option].name);
6ef393b
+		DBG(1, "%s: option num = %d out of range (0..%d)\n", __func__, option, NUM_OPTIONS - 1);
6ef393b
 		return SANE_STATUS_INVAL;
6ef393b
 	}
6ef393b
 
6ef393b
+	DBG(2, "%s: action = %x, option = %d %s\n", __func__, action, option, s->opt[option].name);
6ef393b
+
6ef393b
 	if (info != NULL)
6ef393b
 		*info = 0;
6ef393b
 
6ef393b
diff --git a/backend/pixma_bjnp.c b/backend/pixma_bjnp.c
6ef393b
index a1730ad..1020b8d 100644
6ef393b
--- a/backend/pixma_bjnp.c
6ef393b
+++ b/backend/pixma_bjnp.c
6ef393b
@@ -130,11 +130,11 @@ static void
6ef393b
 u32tohex (uint32_t x, char *str)
6ef393b
 {
6ef393b
   uint8_t uint8[4];
6ef393b
-   uint8[0]= (uint8_t) x >> 24;
6ef393b
-   uint8[1] = (uint8_t)x >> 16;
6ef393b
-   uint8[2] = (uint8_t)x >> 8;
6ef393b
-   uint8[3] = (uint8_t)x ;
6ef393b
-   u8tohex(str, uint8, 4);
6ef393b
+  uint8[0] = (uint8_t)(x >> 24);
6ef393b
+  uint8[1] = (uint8_t)(x >> 16);
6ef393b
+  uint8[2] = (uint8_t)(x >> 8);
6ef393b
+  uint8[3] = (uint8_t)x ;
6ef393b
+  u8tohex(str, uint8, 4);
6ef393b
 }
6ef393b
 
6ef393b
 static void
6ef393b
@@ -284,7 +284,8 @@ parse_IEEE1284_to_model (char *scanner_id, char *model)
6ef393b
   char s[BJNP_IEEE1284_MAX];
6ef393b
   char *tok;
6ef393b
 
6ef393b
-  strcpy (s, scanner_id);
6ef393b
+  strncpy (s, scanner_id, BJNP_IEEE1284_MAX);
6ef393b
+  s[BJNP_IEEE1284_MAX - 1] = '\0';
6ef393b
   model[0] = '\0';
6ef393b
 
6ef393b
   tok = strtok (s, ";");
6ef393b
@@ -441,7 +442,8 @@ split_uri (const char *devname, char *method, char *host, char *port,
6ef393b
   char next;
6ef393b
   int i;
6ef393b
 
6ef393b
-  strcpy (copy, devname);
6ef393b
+  strncpy (copy, devname, 1024);
6ef393b
+  copy[1023] = '\0';
6ef393b
   start = copy;
6ef393b
 
6ef393b
 /*
6ef393b
@@ -2313,6 +2315,8 @@ sanei_bjnp_read_int (SANE_Int dn, SANE_Byte * buffer, size_t * size)
6ef393b
         }
6ef393b
       device[dn].polling_status = BJNP_POLL_STARTED;
6ef393b
 
6ef393b
+      /* fall through to BJNP_POLL_STARTED */
6ef393b
+
6ef393b
     case BJNP_POLL_STARTED:
6ef393b
       /* we use only seonds accuracy between poll attempts */
6ef393b
       timeout = device[dn].bjnp_timeout /1000;
6ef393b
diff --git a/backend/rts8891.c b/backend/rts8891.c
6ef393b
index d86347b..bdb4011 100644
6ef393b
--- a/backend/rts8891.c
6ef393b
+++ b/backend/rts8891.c
6ef393b
@@ -2212,7 +2212,13 @@ sane_close (SANE_Handle handle)
6ef393b
   /* switch off lamp and close usb */
6ef393b
   if (dev->conf.allowsharing == SANE_TRUE)
6ef393b
     {
6ef393b
-      sanei_usb_claim_interface (dev->devnum, 0);
6ef393b
+      SANE_Status status = sanei_usb_claim_interface (dev->devnum, 0);
6ef393b
+      if (status != SANE_STATUS_GOOD)
6ef393b
+        {
6ef393b
+          DBG (DBG_warn, "sane_close: cannot claim usb interface: %s\n",
6ef393b
+               sane_strstatus(status));
6ef393b
+          DBG (DBG_warn, "sane_close: continuing anyway\n");
6ef393b
+        }
6ef393b
     }
6ef393b
   set_lamp_state (session, 0);
6ef393b
   sanei_usb_close (dev->devnum);
6ef393b
@@ -3197,14 +3203,6 @@ find_origin (struct Rts8891_Device *dev, SANE_Bool * changed)
6ef393b
       return status;
6ef393b
     }
6ef393b
 
6ef393b
-  if (status != SANE_STATUS_GOOD)
6ef393b
-    {
6ef393b
-      free(image);
6ef393b
-      free(data);
6ef393b
-      DBG (DBG_error, "find_origin: failed to wait for data\n");
6ef393b
-      return status;
6ef393b
-    }
6ef393b
-
6ef393b
   if (DBG_LEVEL > DBG_io2)
6ef393b
     {
6ef393b
       write_gray_data (data, "find_origin.pnm", width, height);
6ef393b
diff --git a/sanei/sanei_usb.c b/sanei/sanei_usb.c
6ef393b
index 7401658..491ceeb 100644
6ef393b
--- a/sanei/sanei_usb.c
6ef393b
+++ b/sanei/sanei_usb.c
6ef393b
@@ -460,8 +460,6 @@ sanei_libusb_strerror (int errcode)
6ef393b
       default:
6ef393b
 	return "Unknown libusb-1.0 error code";
6ef393b
     }
6ef393b
-
6ef393b
-  return "Unknown libusb-1.0 error code";
6ef393b
 }
6ef393b
 #endif /* HAVE_LIBUSB_1_0 */
6ef393b
 
6ef393b
diff --git a/tools/sane-find-scanner.c b/tools/sane-find-scanner.c
6ef393b
index dbfd0da..ae0e116 100644
6ef393b
--- a/tools/sane-find-scanner.c
6ef393b
+++ b/tools/sane-find-scanner.c
6ef393b
@@ -757,8 +757,6 @@ sfs_libusb_strerror (int errcode)
6ef393b
       default:
6ef393b
 	return "Unknown libusb-1.0 error code";
6ef393b
     }
6ef393b
-
6ef393b
-  return "Unknown libusb-1.0 error code";
6ef393b
 }
6ef393b
 
6ef393b
 static char *
6ef393b
-- 
6ef393b
1.8.4.2
6ef393b