Print dialog, CUPS: Check unknown option values whether they are actually custom settings
a user reports that his printer stops printing after an upgrade from an older Ubuntu version to Bionic (18.04).
What happened was that the upgrade also updated the printer driver and with this the page size names in the PPD file of the print queue changed. The GTK print dialog remembers printer driver settings and as after the upgrade the remembered page size name was not in the PPD any more, the GTK dialog considered it a custom setting and prefixed it with "Custom.". This made the page size not recognized by CUPS and the job aborted.
The patch added in this pull request fixes the bug.
If the GTK print dialog finds a choice for a print option (Page Size, Media Type, Resolution, Print Quality, ...) which is not under the currently available choices (according to the PPD file in /etc/cups/ppd/) it checks whether the option supports custom values and if so, it considers the value a custom value and prefixes it with "Custom." regardless of whether this is a valid custom value. This usually works, if the user types in a custom value in the print dialog, as the dialog provides the correct interface for a custom value for this option.
Now there is a case where this easily breaks:
The dialog saves the last settings (printer selection and option settings) which the user has used for printing so that the next time the app is opened and the document printed, the saved settings are used by default. Now let us choose a certain not that common paper size and print. Then we close the app and do a system update. The update contains a new version of our printer driver and one of the changes is that some paper sizes in the PPD get renamed. So the paper size name we have used for our last print job is not contained in the new PPD any more. Now we open the app again and print the document right away, without going through the options tabs of the print dialog and also not changing to another printer. The print dialog recovers the saved options including the (old) page size name. As the name does not match any page size name of the new PPD, the dialog prefixes it with "Custom." and sends off the job. The CUPS filters are not able to identify the paper size name and the job errors.
Reproducer (Make sure CUPS is in debug logging mode, run "
- Create a print queue with a PPD.
- evince an arbitrary PDF file
- Click the print icon
- In the print dialog choose the newly created queue and choose some uncommon paper size (not custom). Click "Print".
- Check /var/log/cups/error_log, the page size gets correctly received.
- Close evince.
- Stop CUPS, edit the PPD file removing the paper size you have selected for your job in the PageSize, PageRegion, PaperDimension, and ImageableArea lines.
- Start CUPS.
- Open the same PDF file again with evince, click Print and then select "Print" in the print dialog without changing anything.
- The job fails, in /var/log/cups/error_log you see that the page size is prefixed with "Custom.".
With the attached patch the print dialog checks the syntax of the unknown option value and only if the syntax is correct for the particular option, "Custom." is added. In the case of a page size name this does not happen as a custom page size has to be specified as "Custom.XXXxYYY[unit]", like "Custom.21x29.7cm".