Package: lpr
Version: 1:2008.05.17

I am using Debian squeeze/sid.

According to the lprm's source code, this command (which is setuid-root on
squeeze/sid) can be used with the "-w" option in order to specify a timeout 
value.  But the program exits with SIGSEGV signal when using this option:

  $ lprm -w 30
  Segmentation fault

  $ cat -n lpr-2008.05.17/lprm/lprm.c
  [...]
  120           while ((ch = getopt(argc, argv, "P:w")) != -1) {
  121                   switch (ch) {
  122                   case 'P':
  123                           printer = optarg;
  124                           break;
  125                   case 'w':
  126                           l = strtol(optarg, &cp, 10);
  127                           if (*cp != '\0' || l < 0 || l >= INT_MAX)

As seen in the source code, when parsing options (line 125 and 126), 
"optarg" (supposed to be -w's argument) is stored as a long integer into 
"&cp", but it fails because "optarg" is always NULL.  Function getopt() 
sets optarg only when an option takes an argument, and according to the 
optstring ("P:w", line 120), "-w" does not require an option which is
wrong.

Why is this option not documented in lprm(1) or "--help" ?

Anyway, this fixes the bug :

--- lprm.c.orig 2010-10-31 18:25:25.000000000 +0100
+++ lprm.c      2010-10-31 18:25:45.000000000 +0100
@@ -117,7 +117,7 @@
                fatal("Your name is too long");
        strlcpy(luser, pw->pw_name, sizeof(luser));
        person = luser;
-       while ((ch = getopt(argc, argv, "P:w")) != -1) {
+       while ((ch = getopt(argc, argv, "P:w:")) != -1) {
                switch (ch) {
                case 'P':
                        printer = optarg;




-- 
To UNSUBSCRIBE, email to debian-bugs-dist-requ...@lists.debian.org
with a subject of "unsubscribe". Trouble? Contact listmas...@lists.debian.org

Reply via email to