Please do not reply directly to this email. All additional comments should be made in the comments box of this bug report.
Summary: (libperl) could not run system-config-printer
https://bugzilla.redhat.com/bugzilla/show_bug.cgi?id=171111
jvdias@redhat.com changed:
What |Removed |Added ---------------------------------------------------------------------------- Status|NEW |ASSIGNED
------- Additional Comments From jvdias@redhat.com 2005-10-24 16:49 EST ------- OK, it appears this command has caused a SIGSEGV when run with STDIN directed a USB printer device:
# perl -e 'ioctl(STDIN,0x84005001,$result); print $result' </dev/usb/lp0
from: /usr/share/printconf/util/printconf_conf.py, @ line 1460: magic_perl = "perl -e 'ioctl(STDIN,0x84005001,$result);" magic_perl += "print $result' 2>/dev/null <" foo = os.popen (magic_perl + dev) rawid = foo.readlines ()
Why not use the Python fcntl.ioctl() call here ?
It would be interesting to see if python also has a problem with this ioctl:
# python
import os, fcntl, array; result=array.array(1024) fcntl.ioctl( os.open("/dev/usb/lp0","r"), -2080354303, result, 1 )
I've just now tried running the perl command above with STDIN directed to an RS-232 serial port, (the only serial device I have here at work) on up-to-date Rawhide, FC-4, RHEL-4 and FC-3 systems, and have not been able to reproduce the problem.
I do have a USB printer at home, and I try to reproduce this problem there.
But googling for 0x84005001 turned up
http://home.techwiz.ca/ftp/Linux/dist/MandrakeLinux/official/9.2/i586/Mandra... : # Calculation of IOCTL function 0x84005001 (to get device ID # string): # len = 1024 # IOCNR_GET_DEVICE_ID = 1 # LPIOC_GET_DEVICE_ID(len) = # _IOC(_IOC_READ, 'P', IOCNR_GET_DEVICE_ID, len) # _IOC(), _IOC_READ as defined in /usr/include/asm/ioctl.h # Use "eval" so that program does not stop when IOCTL fails eval { my $output = "\0" x 1024; ioctl($PORT, 0x84005001, $output); $idstr = $output; } or do { close $PORT; next; };
Note how the programmer is careful to allocate a 1024 buffer for the RW ioctl $output parameter, since the 0x84005001 says "I am passing in an 1024 byte RW buffer" .
Perhaps the SEGV occurs only when a USB printer is on STDIN, because only a USB printer actually returns an ID string, which writes into the (empty) $result buffer ?
Does the problem still occur if the command is ammended :
perl -e '$result="\0" x 1024; ioctl(STDIN,0x84005001,$result);print $result,"\n";' </dev/usb/lp0
If not, I don't think it this a PERL bug , but a programming error - any use of ioctl(x,0x84005001,buf), invoked from a C program, will cause a SIGSEGV if the ioctl returns data in buf and buf does not point to a 1024 byte buffer .
Can anyone reading this with access to a USB printer please verify, with latest versions that this is still a bug:
1. Does this command produces a SIGSEGV: # perl -e 'ioctl(STDIN,0x84005001,$result); print $result' </dev/usb/lp0
2. Does this command produce a SIGSEGV : # perl -e '$result="\0" x 1024; ioctl(STDIN,0x84005001,$result); print $result' </dev/usb/lp0
If the answer to (2) is NO, then this is not a PERL bug.
perl-devel@lists.fedoraproject.org