[sane-devel] sane-backends (eposn2) segfaults pretty much all the time

Johannes Bauer dfnsonfsduifb at gmx.de
Thu Oct 3 09:32:02 UTC 2013


Hi list,

I have two scanners, one that uses the epson2 backend and a nex ScanSnap
ix500 which uses the fujitsu. For the newer ix500 I needed a fairly
recent version, so I'm currently using git head of sane-backends. This
report concerns 472daf78.

First note: the epson2 backend doesn't compile, because the pedantic
setup forces C90 and mixed declarations and code are C99. Change
concerns backend/epson2-ops.c line 234 where I simply created a new
scope before the declaration/initialization of "int last" until line
256. Then it compiles.

However, it continuously blows up in my face with segfaults:

$ scanimage --resolution 150 --mode Gray
scanimage: output is not a file, exiting
Segmentation fault

$ scanimage --help
Usage: scanimage [OPTION]...

Start image acquisition on a scanner device and write image data to
standard output.
[...]
Options specific to device `epson2:libusb:001:008':
  Scan Mode:
    --mode Lineart|Gray|Color [Lineart]
[...]

Type ``scanimage --help -d DEVICE'' to get list of all options for DEVICE.

List of available devices:
Segmentation fault

This here starts scanning a complete document, actually creates a file,
then outputs some broken debug output (control character is outputted)
and then hangs (never exits):
$ scanimage --resolution 150 --mode Gray >x
[Some weird CTRL char]libusb: 0.000000 warning [libusb_close] internal
signalling read failed, closing anyway
libusb: 0.000019 error [do_close] Device handle closed while transfer
was still being processed, but the device is still connected as far as
we know
libusb: 0.000026 error [do_close] A cancellation hasn't even been
scheduled on the transfer for which the device is closing

After I abort the hang with Ctrl-C, the scanner isn't recognized anymore
and I need to plug it out and into USB again.

Tracing the segfault for this command:
$ /usr/local/bin/scanimage --resolution 150 --mode Gray

yields:

#0  0x00007ffff4bd48c3 in libusb_submit_transfer () from
/usr/lib64/libusb-1.0.so.0
#1  0x00007ffff4bd600f in do_sync_bulk_transfer () from
/usr/lib64/libusb-1.0.so.0
#2  0x00007ffff4bd6384 in libusb_bulk_transfer () from
/usr/lib64/libusb-1.0.so.0
#3  0x00007ffff67fbf66 in usb_bulk_io.isra.1 () from
/usr/lib64/libusb-0.1.so.4
#4  0x00007ffff7bb93ae in sanei_usb_write_bulk (dn=0,
buffer=0x7fffffffb760 "\033Fz\365\377\177", size=0x7fffffffb708) at
sanei_usb.c:2433
#5  0x00007ffff42a3f3e in e2_send (s=0x627580, buf=0x7fffffffb760,
buf_size=2, reply_len=4, status=0x7fffffffb75c) at epson2-io.c:99
#6  0x00007ffff42a522d in esci_request_status (handle=0x627580,
scanner_status=0x0) at epson2-commands.c:394
#7  0x00007ffff429ffc2 in close_scanner (s=0x627580) at epson2.c:365
#8  0x00007ffff42a2214 in sane_epson2_close (handle=0x627580) at
epson2.c:1545
#9  0x00007ffff7bcb234 in sane_dll_close (handle=0x618710) at dll.c:1223
#10 0x0000000000405d6d in scanimage_exit () at scanimage.c:1654
#11 0x00007ffff5445721 in __run_exit_handlers (status=1,
listp=0x7ffff57ad5a8 <__exit_funcs>, run_list_atexit=true) at exit.c:78
#12 0x00007ffff54457a5 in __GI_exit (status=<optimized out>) at exit.c:100
#13 0x0000000000402ad3 in main (argc=<optimized out>,
argv=0x7fffffffd9f8) at scanimage.c:2040

The backtrace with the appropriate code:

(gdb) up
#1  0x00007ffff4bd600f in do_sync_bulk_transfer () from
/usr/lib64/libusb-1.0.so.0
(gdb) up
#2  0x00007ffff4bd6384 in libusb_bulk_transfer () from
/usr/lib64/libusb-1.0.so.0
(gdb) up
#3  0x00007ffff67fbf66 in usb_bulk_io.isra.1 () from
/usr/lib64/libusb-0.1.so.4
(gdb) up
#4  0x00007ffff7bb93ae in sanei_usb_write_bulk (dn=0,
buffer=0x7fffffffb820 "\033Fz\365\377\177", size=0x7fffffffb7c8) at
sanei_usb.c:2433
2433		  write_size = usb_bulk_write (devices[dn].libusb_handle,
(gdb) up
#5  0x00007ffff42a3f3e in e2_send (s=0x627580, buf=0x7fffffffb820,
buf_size=2, reply_len=4, status=0x7fffffffb81c) at epson2-io.c:99
99			*status = sanei_usb_write_bulk(s->fd, buf, &n);
(gdb) up
#6  0x00007ffff42a522d in esci_request_status (handle=0x627580,
scanner_status=0x0) at epson2-commands.c:394
394		e2_send(s, params, 2, 4, &status);
(gdb) up
#7  0x00007ffff429ffc2 in close_scanner (s=0x627580) at epson2.c:365
365			esci_request_status(s, NULL);
(gdb) up
#8  0x00007ffff42a2214 in sane_epson2_close (handle=0x627580) at
epson2.c:1545
1545			close_scanner(s);
(gdb) up
#9  0x00007ffff7bcb234 in sane_dll_close (handle=0x618710) at dll.c:1223
1223	  (*(op_close_t)s->be->op[OP_CLOSE]) (s->handle);
(gdb) up
#10 0x0000000000405d6d in scanimage_exit () at scanimage.c:1654
1654	      sane_close (device);
(gdb) up
#11 0x00007ffff5445721 in __run_exit_handlers (status=1,
listp=0x7ffff57ad5a8 <__exit_funcs>, run_list_atexit=true) at exit.c:78
78		      cxafct (f->func.cxa.arg, status);
(gdb) up
#12 0x00007ffff54457a5 in __GI_exit (status=<optimized out>) at exit.c:100
100	  __run_exit_handlers (status, &__exit_funcs, true);
(gdb) up
#13 0x0000000000402ad3 in main (argc=<optimized out>,
argv=0x7fffffffdab8) at scanimage.c:2040
2040		  exit (1);

If there's anything I could do to further trace this problem, please let
me know. It would be awesome to have a sane backends version that works
with both scanners, not just one or the other :-(

Best regards,
Johannes



More information about the sane-devel mailing list