[sane-devel] Microtek SANE bug and fix for ADF

Maurice Hilarius maurice at harddata.com
Tue Nov 20 04:20:49 GMT 2001


If you have a Microtek or similar scanner with an automatic document feeder 
(ADF) then there is a bug in the SANE code for using this feeder device.

We have been working with a Microtek ScanMaker X12USL, and ran into a 
problem with the code for the ADF handling.
After a multi-page scan, it would crash you right out of X!

As this is not a desirable feature, we have been looking into the reasons 
for this.

Fortunately we have found it, and I include a patch at the end of this message.

The problem is in the 'cancel_scan()' function in microtek2.c.

When using the automatic document feeder, after it has scanned all the 
pages, and there are no more pages to scan, this function is called after 
an I/O error ir produced by the lack of a page to feed.
It is then supposed to stop the scanner from trying to scan any more pages.

A comment in the code says:

"/* READ IMAGE with a transferlength of 0 aborts a scan */".

This is fine, but then 'close(ms->fd[1])'  may be called
ms->fd[1] equal to -1      (which does not have any nasty consequences,)

BUT! a bit below that you effectively have 'kill(-1, SIGTERM);'.

Try 'man 2 kill' to see what this does. :-)

After this patch:

--- sane-backends-1.0.5/backend/microtek2.c~	Sun May 27 04:20:20 2001
+++ sane-backends-1.0.5/backend/microtek2.c	Mon Nov 19 19:11:05 2001
@@ -1403,8 +1403,15 @@
          status = SANE_STATUS_CANCELLED;

      close(ms->fd[1]);
-    kill(ms->pid, SIGTERM);
-    waitpid(ms->pid, NULL, 0);
+    /* if we are aborting a scan because, for example, we run out
+       of material on a feeder, then pid may be already -1 and
+       kill(-1, SIGTERM), i.e. killing all our processes, is not
+       likely what we really want - --mj, 2001/Nov/19 */
+    if (ms->pid > 1)
+      {
+	kill(ms->pid, SIGTERM);
+	waitpid(ms->pid, NULL, 0);
+      }

      return status;
  }

With this revision of the code runs of batch scans using "ADF" settings 
terminate properly and without any other visible side-effects.

I have no idea if other backends have similar problems; 'kill()' call
is used in a number of places.


Meanwhile, an other trivial trouble we see is that 'scanimage' without any 
explicitly specified format is still using an extension of '.pnm' even if 
'--format tiff' is given.

For further excitement the manpage claims that "out%d.tif" is _always_ the 
default; at least in the presence of '--batch'.

Perhaps this is related to the "features" of a given scanner,  but with the 
"ScanMaker X12USL", (while using the microtek2 backend), we are getting 
"stripes" on both sides of scanned images.

'--backend-calibration' options, which some docs suggest may help with 
that, is listed by 'scanimage --help' as "[inactive]".

Indeed, it seems to not make any difference.

Does anyone have any suggestions or ideas for what to do with that problem?

Maurice Hilarius and  Michal Jaegermann

maurice at harddata.com
michal at harddata.com


With our best regards,

Maurice W. Hilarius       Telephone: 01-780-456-9771
Hard Data Ltd.               FAX:       01-780-456-9772
11060 - 166 Avenue        mailto:maurice at harddata.com
Edmonton, AB, Canada      http://www.harddata.com/
    T5X 1Y3





More information about the sane-devel mailing list