sane-project-website/old-archive/1999-04/0398.html

323 wiersze
14 KiB
HTML

<!-- received="Tue Apr 27 18:37:14 1999 PDT" -->
<!-- sent="Wed, 28 Apr 1999 11:40:16 +1000 (EST)" -->
<!-- name="Graham Stoney" -->
<!-- email="greyham@research.canon.com.au" -->
<!-- subject="Possible fix for Sane 1.0.1 segfault in RedHat 5.1 (net)" -->
<!-- id="199904280140.LAA09898@sid.research.canon.com.au" -->
<!-- inreplyto="199904201640.SAA02091@lee.Cc.Uit.No" -->
<title>sane-devel: Possible fix for Sane 1.0.1 segfault in RedHat 5.1 (net)</title>
<h1>Possible fix for Sane 1.0.1 segfault in RedHat 5.1 (net)</h1>
<b>Graham Stoney</b> (<a href="mailto:greyham@research.canon.com.au"><i>greyham@research.canon.com.au</i></a>)<br>
<i>Wed, 28 Apr 1999 11:40:16 +1000 (EST)</i>
<p>
<ul>
<li> <b>Messages sorted by:</b> <a href="date.html#398">[ date ]</a><a href="index.html#398">[ thread ]</a><a href="subject.html#398">[ subject ]</a><a href="author.html#398">[ author ]</a>
<!-- next="start" -->
<li> <b>Next message:</b> <a href="0399.html">abel deuring: "Re: HP PhotoSmart R030 vs. SANE 1.01"</a>
<li> <b>Previous message:</b> <a href="0397.html">henk van der knaap: "Re: HEEEELP!!!!!!!!!!!"</a>
<li> <b>In reply to:</b> <a href="0271.html">Petter Reinholdtsen: "Sane 1.01pre5 segfaults in RedHat 5.1 (net)"</a>
<!-- nextthread="start" -->
<li> <b>Next in thread:</b> <a href="0412.html">Milon Firikis: "Re: Possible fix for Sane 1.0.1 segfault in RedHat 5.1 (net)"</a>
<li> <b>Reply:</b> <a href="0412.html">Milon Firikis: "Re: Possible fix for Sane 1.0.1 segfault in RedHat 5.1 (net)"</a>
<!-- reply="end" -->
</ul>
<!-- body="start" -->
[Milon Firikis]<br>
<i>&gt; I keep getting SIGSEGVs in redhat 5.1</i><br>
<i>&gt; </i><br>
<i>&gt; I have reported it some time ago... but I am not qualified to find</i><br>
<i>&gt; the solution...</i><br>
<p>
I've just tried using the net backend on redhat 5.1, and also got SIGSEGVs.<br>
It looks like I'm qualified to offer the fix below, but I don't know for sure<br>
whether it fixes Milon's problem. If it does, his SIGSEGV is likely to turn<br>
into an error message, though it may not mean that scanning actually works.<br>
<p>
My problem was that my backend was not setting the type field for option<br>
descriptor zero, causing sanei_w_call to fail with wire.status == EINVAL<br>
because it didn't know how to encode the descriptor's value. In sane-1.0.1,<br>
backend/net.c:sane_control_option fails to check whether<br>
sanei_w_call(...,SANE_NET_CONTROL_OPTION,...) succeeds before using the reply<br>
info. If it fails, we get a segfault. Perhaps something in Milon's config is<br>
causing this call to fail, but as far as I can see it will cause disaster on<br>
any system when the sanei_w_call in sane_control_option fails. The first<br>
patch below adds the missing test, and fixes the segfault.<br>
<p>
While looking at the existing backends, I noticed that very few of them set<br>
the "type" field on option descriptor zero correctly. Most rely on a memset<br>
of all the option descriptors to set it to zero, giving it a value of<br>
SANE_TYPE_BOOL. It's meant to be a SANE_TYPE_INT however; we're just lucky<br>
that the encoding for BOOL and INT is the same, so it works. The remaining<br>
patches explicitly set the type for the first descriptor to SANE_TYPE_INT in<br>
all the backends that appear (to my untrained eye) to get it wrong.<br>
<p>
Regards,<br>
Graham<br>
<p>
<p>
Index: backend/net.c<br>
===================================================================<br>
RCS file: /home/elph/archive/sane/backend/net.c,v<br>
retrieving revision 1.1.1.1<br>
diff -c -r1.1.1.1 net.c<br>
*** net.c 1999/04/27 05:38:03 1.1.1.1<br>
--- net.c 1999/04/27 07:51:36<br>
***************<br>
*** 704,709 ****<br>
--- 704,716 ----<br>
sanei_w_call (&amp;s-&gt;hw-&gt;wire, SANE_NET_CONTROL_OPTION,<br>
(WireCodecFunc) sanei_w_control_option_req, &amp;req,<br>
(WireCodecFunc) sanei_w_control_option_reply, &amp;reply);<br>
+ if (s-&gt;hw-&gt;wire.status != 0)<br>
+ {<br>
+ DBG(1, "control_option rpc call failed (%s)\n",<br>
+ strerror (s-&gt;hw-&gt;wire.status));<br>
+ return SANE_STATUS_IO_ERROR;<br>
+ }<br>
+ <br>
status = reply.status;<br>
need_auth = (reply.resource_to_authorize != 0);<br>
if (need_auth)<br>
<p>
<p>
Index: backend/abaton.c<br>
===================================================================<br>
RCS file: /home/elph/archive/sane/backend/abaton.c,v<br>
retrieving revision 1.1.1.1<br>
diff -c -r1.1.1.1 abaton.c<br>
*** abaton.c 1999/04/27 05:38:09 1.1.1.1<br>
--- abaton.c 1999/04/28 01:17:32<br>
***************<br>
*** 644,649 ****<br>
--- 644,650 ----<br>
<br>
s-&gt;opt[OPT_NUM_OPTS].title = SANE_TITLE_NUM_OPTIONS;<br>
s-&gt;opt[OPT_NUM_OPTS].desc = SANE_DESC_NUM_OPTIONS;<br>
+ s-&gt;opt[OPT_NUM_OPTS].type = SANE_TYPE_INT;<br>
s-&gt;opt[OPT_NUM_OPTS].cap = SANE_CAP_SOFT_DETECT;<br>
s-&gt;val[OPT_NUM_OPTS].w = NUM_OPTIONS;<br>
<br>
Index: backend/agfafocus.c<br>
===================================================================<br>
RCS file: /home/elph/archive/sane/backend/agfafocus.c,v<br>
retrieving revision 1.1.1.1<br>
diff -c -r1.1.1.1 agfafocus.c<br>
*** agfafocus.c 1999/04/27 05:38:12 1.1.1.1<br>
--- agfafocus.c 1999/04/28 01:17:46<br>
***************<br>
*** 1007,1012 ****<br>
--- 1007,1013 ----<br>
<br>
s-&gt;opt[OPT_NUM_OPTS].title = SANE_TITLE_NUM_OPTIONS;<br>
s-&gt;opt[OPT_NUM_OPTS].desc = SANE_DESC_NUM_OPTIONS;<br>
+ s-&gt;opt[OPT_NUM_OPTS].type = SANE_TYPE_INT;<br>
s-&gt;opt[OPT_NUM_OPTS].cap = SANE_CAP_SOFT_DETECT;<br>
s-&gt;val[OPT_NUM_OPTS].w = NUM_OPTIONS;<br>
<br>
Index: backend/apple.c<br>
===================================================================<br>
RCS file: /home/elph/archive/sane/backend/apple.c,v<br>
retrieving revision 1.1.1.1<br>
diff -c -r1.1.1.1 apple.c<br>
*** apple.c 1999/04/27 05:38:07 1.1.1.1<br>
--- apple.c 1999/04/28 01:17:56<br>
***************<br>
*** 1286,1291 ****<br>
--- 1286,1292 ----<br>
<br>
s-&gt;opt[OPT_NUM_OPTS].title = SANE_TITLE_NUM_OPTIONS;<br>
s-&gt;opt[OPT_NUM_OPTS].desc = SANE_DESC_NUM_OPTIONS;<br>
+ s-&gt;opt[OPT_NUM_OPTS].type = SANE_TYPE_INT;<br>
s-&gt;opt[OPT_NUM_OPTS].cap = SANE_CAP_SOFT_DETECT;<br>
s-&gt;val[OPT_NUM_OPTS].w = NUM_OPTIONS;<br>
<br>
Index: backend/artec.c<br>
===================================================================<br>
RCS file: /home/elph/archive/sane/backend/artec.c,v<br>
retrieving revision 1.1.1.1<br>
diff -c -r1.1.1.1 artec.c<br>
*** artec.c 1999/04/27 05:38:06 1.1.1.1<br>
--- artec.c 1999/04/28 01:18:06<br>
***************<br>
*** 1378,1383 ****<br>
--- 1378,1384 ----<br>
<br>
s-&gt;opt[OPT_NUM_OPTS].title = SANE_TITLE_NUM_OPTIONS;<br>
s-&gt;opt[OPT_NUM_OPTS].desc = SANE_DESC_NUM_OPTIONS;<br>
+ s-&gt;opt[OPT_NUM_OPTS].type = SANE_TYPE_INT;<br>
s-&gt;opt[OPT_NUM_OPTS].cap = SANE_CAP_SOFT_DETECT;<br>
s-&gt;val[OPT_NUM_OPTS].w = NUM_OPTIONS;<br>
<br>
Index: backend/canon.c<br>
===================================================================<br>
RCS file: /home/elph/archive/sane/backend/canon.c,v<br>
retrieving revision 1.1.1.1<br>
diff -c -r1.1.1.1 canon.c<br>
*** canon.c 1999/04/27 05:38:06 1.1.1.1<br>
--- canon.c 1999/04/28 01:18:41<br>
***************<br>
*** 1150,1155 ****<br>
--- 1150,1156 ----<br>
<br>
s-&gt;opt[OPT_NUM_OPTS].title = SANE_TITLE_NUM_OPTIONS;<br>
s-&gt;opt[OPT_NUM_OPTS].desc = SANE_DESC_NUM_OPTIONS;<br>
+ s-&gt;opt[OPT_NUM_OPTS].type = SANE_TYPE_INT;<br>
s-&gt;opt[OPT_NUM_OPTS].cap = SANE_CAP_SOFT_DETECT;<br>
s-&gt;val[OPT_NUM_OPTS].w = NUM_OPTIONS;<br>
<br>
Index: backend/coolscan.c<br>
===================================================================<br>
RCS file: /home/elph/archive/sane/backend/coolscan.c,v<br>
retrieving revision 1.1.1.1<br>
diff -c -r1.1.1.1 coolscan.c<br>
*** coolscan.c 1999/04/27 05:38:07 1.1.1.1<br>
--- coolscan.c 1999/04/28 01:18:52<br>
***************<br>
*** 1542,1547 ****<br>
--- 1542,1548 ----<br>
<br>
scanner-&gt;opt[OPT_NUM_OPTS].title = SANE_TITLE_NUM_OPTIONS;<br>
scanner-&gt;opt[OPT_NUM_OPTS].desc = SANE_DESC_NUM_OPTIONS;<br>
+ scanner-&gt;opt[OPT_NUM_OPTS].type = SANE_TYPE_INT;<br>
scanner-&gt;opt[OPT_NUM_OPTS].cap = SANE_CAP_SOFT_DETECT;<br>
<br>
/* "Mode" group: */<br>
Index: backend/epson.c<br>
===================================================================<br>
RCS file: /home/elph/archive/sane/backend/epson.c,v<br>
retrieving revision 1.1.1.1<br>
diff -c -r1.1.1.1 epson.c<br>
*** epson.c 1999/04/27 05:38:06 1.1.1.1<br>
--- epson.c 1999/04/28 01:19:36<br>
***************<br>
*** 1022,1027 ****<br>
--- 1022,1028 ----<br>
<br>
s-&gt;opt[OPT_NUM_OPTS].title = SANE_TITLE_NUM_OPTIONS;<br>
s-&gt;opt[OPT_NUM_OPTS].desc = SANE_DESC_NUM_OPTIONS;<br>
+ s-&gt;opt[OPT_NUM_OPTS].type = SANE_TYPE_INT;<br>
s-&gt;opt[OPT_NUM_OPTS].cap = SANE_CAP_SOFT_DETECT;<br>
s-&gt;val[OPT_NUM_OPTS] = NUM_OPTIONS;<br>
<br>
Index: backend/pint.c<br>
===================================================================<br>
RCS file: /home/elph/archive/sane/backend/pint.c,v<br>
retrieving revision 1.1.1.1<br>
diff -c -r1.1.1.1 pint.c<br>
*** pint.c 1999/04/27 05:38:05 1.1.1.1<br>
--- pint.c 1999/04/28 01:20:19<br>
***************<br>
*** 387,392 ****<br>
--- 387,393 ----<br>
<br>
s-&gt;opt[OPT_NUM_OPTS].title = SANE_TITLE_NUM_OPTIONS;<br>
s-&gt;opt[OPT_NUM_OPTS].desc = SANE_DESC_NUM_OPTIONS;<br>
+ s-&gt;opt[OPT_NUM_OPTS].type = SANE_TYPE_INT;<br>
s-&gt;opt[OPT_NUM_OPTS].cap = SANE_CAP_SOFT_DETECT;<br>
s-&gt;val[OPT_NUM_OPTS].w = NUM_OPTIONS;<br>
<br>
Index: backend/ricoh.c<br>
===================================================================<br>
RCS file: /home/elph/archive/sane/backend/ricoh.c,v<br>
retrieving revision 1.1.1.1<br>
diff -c -r1.1.1.1 ricoh.c<br>
*** ricoh.c 1999/04/27 05:38:12 1.1.1.1<br>
--- ricoh.c 1999/04/28 01:20:43<br>
***************<br>
*** 319,324 ****<br>
--- 319,325 ----<br>
<br>
s-&gt;opt[OPT_NUM_OPTS].title = SANE_TITLE_NUM_OPTIONS;<br>
s-&gt;opt[OPT_NUM_OPTS].desc = SANE_DESC_NUM_OPTIONS;<br>
+ s-&gt;opt[OPT_NUM_OPTS].type = SANE_TYPE_INT;<br>
s-&gt;opt[OPT_NUM_OPTS].cap = SANE_CAP_SOFT_DETECT;<br>
s-&gt;val[OPT_NUM_OPTS].w = NUM_OPTIONS;<br>
<br>
Index: backend/s9036.c<br>
===================================================================<br>
RCS file: /home/elph/archive/sane/backend/s9036.c,v<br>
retrieving revision 1.1.1.1<br>
diff -c -r1.1.1.1 s9036.c<br>
*** s9036.c 1999/04/27 05:38:06 1.1.1.1<br>
--- s9036.c 1999/04/28 01:20:53<br>
***************<br>
*** 675,680 ****<br>
--- 675,681 ----<br>
<br>
s-&gt;opt[OPT_NUM_OPTS].title = SANE_TITLE_NUM_OPTIONS;<br>
s-&gt;opt[OPT_NUM_OPTS].desc = SANE_DESC_NUM_OPTIONS;<br>
+ s-&gt;opt[OPT_NUM_OPTS].type = SANE_TYPE_INT;<br>
s-&gt;opt[OPT_NUM_OPTS].cap = SANE_CAP_SOFT_DETECT;<br>
s-&gt;val[OPT_NUM_OPTS] = NUM_OPTIONS;<br>
<br>
Index: backend/sharp.c<br>
===================================================================<br>
RCS file: /home/elph/archive/sane/backend/sharp.c,v<br>
retrieving revision 1.1.1.1<br>
diff -c -r1.1.1.1 sharp.c<br>
*** sharp.c 1999/04/27 05:38:08 1.1.1.1<br>
--- sharp.c 1999/04/28 01:22:36<br>
***************<br>
*** 688,693 ****<br>
--- 688,694 ----<br>
<br>
s-&gt;opt[OPT_NUM_OPTS].title = SANE_TITLE_NUM_OPTIONS;<br>
s-&gt;opt[OPT_NUM_OPTS].desc = SANE_DESC_NUM_OPTIONS;<br>
+ s-&gt;opt[OPT_NUM_OPTS].type = SANE_TYPE_INT;<br>
s-&gt;opt[OPT_NUM_OPTS].cap = SANE_CAP_SOFT_DETECT;<br>
s-&gt;val[OPT_NUM_OPTS].w = NUM_OPTIONS;<br>
<br>
Index: backend/tamarack.c<br>
===================================================================<br>
RCS file: /home/elph/archive/sane/backend/tamarack.c,v<br>
retrieving revision 1.1.1.1<br>
diff -c -r1.1.1.1 tamarack.c<br>
*** tamarack.c 1999/04/27 05:38:07 1.1.1.1<br>
--- tamarack.c 1999/04/28 01:21:21<br>
***************<br>
*** 592,597 ****<br>
--- 592,598 ----<br>
<br>
s-&gt;opt[OPT_NUM_OPTS].title = SANE_TITLE_NUM_OPTIONS;<br>
s-&gt;opt[OPT_NUM_OPTS].desc = SANE_DESC_NUM_OPTIONS;<br>
+ s-&gt;opt[OPT_NUM_OPTS].type = SANE_TYPE_INT;<br>
s-&gt;opt[OPT_NUM_OPTS].cap = SANE_CAP_SOFT_DETECT;<br>
s-&gt;val[OPT_NUM_OPTS].w = NUM_OPTIONS;<br>
<br>
Index: backend/umax.c<br>
===================================================================<br>
RCS file: /home/elph/archive/sane/backend/umax.c,v<br>
retrieving revision 1.1.1.1<br>
diff -c -r1.1.1.1 umax.c<br>
*** umax.c 1999/04/27 05:38:03 1.1.1.1<br>
--- umax.c 1999/04/28 01:21:36<br>
***************<br>
*** 3304,3309 ****<br>
--- 3304,3310 ----<br>
<br>
scanner-&gt;opt[OPT_NUM_OPTS].title = SANE_TITLE_NUM_OPTIONS;<br>
scanner-&gt;opt[OPT_NUM_OPTS].desc = SANE_DESC_NUM_OPTIONS;<br>
+ scanner-&gt;opt[OPT_NUM_OPTS].type = SANE_TYPE_INT;<br>
scanner-&gt;opt[OPT_NUM_OPTS].cap = SANE_CAP_SOFT_DETECT;<br>
scanner-&gt;val[OPT_NUM_OPTS].w = NUM_OPTIONS;<br>
<br>
End of patch<br>
<p>
<pre>
--
Source code, list archive, and docs: <a href="http://www.mostang.com/sane/">http://www.mostang.com/sane/</a>
To unsubscribe: echo unsubscribe sane-devel | mail <a href="mailto:majordomo@mostang.com">majordomo@mostang.com</a>
</pre>
<!-- body="end" -->
<p>
<ul>
<!-- next="start" -->
<li> <b>Next message:</b> <a href="0399.html">abel deuring: "Re: HP PhotoSmart R030 vs. SANE 1.01"</a>
<li> <b>Previous message:</b> <a href="0397.html">henk van der knaap: "Re: HEEEELP!!!!!!!!!!!"</a>
<li> <b>In reply to:</b> <a href="0271.html">Petter Reinholdtsen: "Sane 1.01pre5 segfaults in RedHat 5.1 (net)"</a>
<!-- nextthread="start" -->
<li> <b>Next in thread:</b> <a href="0412.html">Milon Firikis: "Re: Possible fix for Sane 1.0.1 segfault in RedHat 5.1 (net)"</a>
<li> <b>Reply:</b> <a href="0412.html">Milon Firikis: "Re: Possible fix for Sane 1.0.1 segfault in RedHat 5.1 (net)"</a>
<!-- reply="end" -->
</ul>