[cups-devel] Solution to lpadmin crashing when discovering HP printers

Michael Sweet msweet at apple.com
Thu Oct 6 04:55:12 PDT 2016


Please file a CUPS bug here:

    https://github.com/apple/cups/issues

AND then contact HP support to let them know they have a bug in their firmware (0x0 is not a valid size and is not allowed by IPP)

Sent from my iPad

> On Oct 6, 2016, at 7:08 AM, Stephan <stephanwib at googlemail.com> wrote:
> 
> Hi!
> 
> Replying to my previous mail: I have set up a SLES 12 box with which I
> was able to work on the cups binaries with gdb. The issue is that the
> printer reports the following properites:
> 
> <key>media-col-default</key>
> <dict>
> <key>media-size</key>
> <dict>
> <key>x-dimension</key>
> <integer>0</integer>
> <key>y-dimension</key>
> <integer>0</integer>
> </dict>
> 
> 
> This leads to a problem in the following code path in cups/ppd-cache.c:
> 
> --------------------------------------------------------------
>  if ((defattr = ippFindAttribute(response, "media-col-default",
> IPP_TAG_BEGIN_COLLECTION)) != NULL)
>  {
>    if ((attr = ippFindAttribute(ippGetCollection(defattr, 0),
> "media-size", IPP_TAG_BEGIN_COLLECTION)) != NULL)
>    {
>      media_size = ippGetCollection(attr, 0);
>      x_dim      = ippFindAttribute(media_size, "x-dimension", IPP_TAG_INTEGER);
>      y_dim      = ippFindAttribute(media_size, "y-dimension", IPP_TAG_INTEGER);
> 
>      if (x_dim && y_dim)
>      {
>        pwg = pwgMediaForSize(ippGetInteger(x_dim, 0), ippGetInteger(y_dim, 0));
>        strlcpy(ppdname, pwg->ppd, sizeof(ppdname));
>      }
>      else
>        strlcpy(ppdname, "Unknown", sizeof(ppdname));
>    }
> -----------------------------------------------------------------------
> 
> The values of the dimensions are not checked and pwgMediaForSize()
> returns a NULL pointer which is then accessed.
> 
> -------------------------------------------------------------------
> (gdb) b pwgMediaForSize
> Function "pwgMediaForSize" not defined.
> Make breakpoint pending on future shared library load? (y or [n]) y
> Breakpoint 1 (pwgMediaForSize) pending.
> (gdb) r
> Starting program: /opt/cups-2.2.1/sbin/lpadmin -p hp-e -v
> ipp://10.70.235.32/ -m everywhere
> Missing separate debuginfos, use: zypper install
> glibc-debuginfo-2.19-31.9.x86_64
> [Thread debugging using libthread_db enabled]
> Using host libthread_db library "/lib64/libthread_db.so.1".
> 
> Breakpoint 1, pwgMediaForSize (width=0, length=0) at pwg-media.c:911
> 911       return (_pwgMediaNearSize(width, length, 176));
> (gdb) bt
> #0  pwgMediaForSize (width=0, length=0) at pwg-media.c:911
> #1  0x00007ffff7b96522 in _ppdCreateFromIPP (buffer=0x7fffffffa2f0
> "/tmp/01cbc57fd2a31", bufsize=16384, response=0x55555576af60) at
> ppd-cache.c:3151
> #2  0x000055555555887c in get_printer_ppd (uri=0x55555575f0a4
> "ipp://10.70.235.32/", buffer=0x7fffffffa2f0 "/tmp/01cbc57fd2a31",
> bufsize=16384) at lpadmin.c:1204
> #3  0x0000555555557345 in main (argc=7, argv=0x7fffffffe3f8) at lpadmin.c:596
> (gdb) finish
> Run till exit from #0  pwgMediaForSize (width=0, length=0) at pwg-media.c:911
> 0x00007ffff7b96522 in _ppdCreateFromIPP (buffer=0x7fffffffa2f0
> "/tmp/01cbc57fd2a31", bufsize=16384, response=0x55555576af60) at
> ppd-cache.c:3151
> 3151            pwg = pwgMediaForSize(ippGetInteger(x_dim, 0),
> ippGetInteger(y_dim, 0));
> Value returned is $1 = (pwg_media_t *) 0x0
> (gdb) quit
> ------------------------------------------------------------------
> 
> Please see below for a possible solution:
> 
> -------------------------------------------------------------------
> --- cups/ppd-cache.c.org    2016-10-06 14:10:34.087111069 +0200
> +++ cups/ppd-cache.c    2016-10-06 14:51:35.731054469 +0200
> @@ -3149,10 +3149,11 @@
>       if (x_dim && y_dim)
>       {
>         pwg = pwgMediaForSize(ippGetInteger(x_dim, 0),
> ippGetInteger(y_dim, 0));
> -    strlcpy(ppdname, pwg->ppd, sizeof(ppdname));
> +    if (pwg)
> +      strlcpy(ppdname, pwg->ppd, sizeof(ppdname));
> +        else
> +          strlcpy(ppdname, "Unknown", sizeof(ppdname));
>       }
> -      else
> -    strlcpy(ppdname, "Unknown", sizeof(ppdname));
>     }
>     else
>       strlcpy(ppdname, "Unknown", sizeof(ppdname));
> ------------------------------------------------------------------
> 
> 
> Regards,
> 
> Stephan
> _______________________________________________
> cups-devel mailing list
> cups-devel at cups.org
> https://lists.cups.org/mailman/listinfo/cups-devel



More information about the cups-devel mailing list