Releases: OpenPrinting/libppd
libppd 2.1.0
Security bug fix release. Early release of 2.1.0 to fix CVE-2024-47175.
- Prevent PPD generation based on invalid IPP response
Overtaken from CUPS 2.x: Validate IPP attributes in PPD generator, refactor make-and-model code, PPDize preset and template names, quote PPD localized strings. Fixes CVE-2024-47175.
libppd 2.1b1
First beta release for libppd 2.1.0.
New features (more to come):
- Support for building with libcups3, CUPS library of CUPS 3.x
(Pull request #27) - Convert
INSTALL
toINSTALL.md
(Pull request #34)
Bug fixes:
- Prefer PDF again in PPDs for driverless printers
PDF works better with finishing, especially combinations of multiple copies, collation, and stapling/binding (Issue #42, Pull request #44). - Use 0.5mm as tolerance when comparing page sizes
For the PWG two page sizes are considered the same when the dimensions differ no more than 0.5 mm, libppd used too tight tolerances (Issue #29, Pull request #46). - PPD generator: Check for required attributes when choosing input format
Check for PCLm and PWG the minimum of attributes which we require during PPD generation. (Pull request #39, #40, Fedora issue). ppdLoadAttributes()
: Improve check whether parameters are integer
(Pull request #38)ppdLoadAttributes()
: Fix crash when page size could not get determined
(Issue #31, Pull request #37)- Fix crash if there is no page size for "Custom"
(Pull request #35, OpenPrinting/cups#849) - Fix crash when incoming
*ptr
is NULL
(Pull request #28, same as OpenPrinting/cups#831) - libcups2 compatibility: Use proper CUPS array callback function types
Fixed CUPS array function call in libcups2 compatibility layer (Pull request #33) - Build system: Fix failure to correctly link to zlib
Look up zlib properly with pkg-config (Pull request #32)
libppd 2.0.0
Final 2.0.0 release with a security vulnerability fix and some other last fixes
ppd_scan_ps()
: Fix CVE-2023-4504
Added check for end of buffer/string when reading escaped character after backslash, return NULL (invalid string) if no character follows.- Promoted the static function "ppd_decode()" of ppd/ppd.c into the API function "ppdDecode()".
ppdEmitJCLPDF()
: Decode "JCLToPDFInterpreter" value in ppdEmitJCLPDF()
Fixes "classic" (non-driverless) PDF printing (Issue #24).ppdLoadAttributes()
: ApplycfIEEE1284NormalizeMakeModel()
to NickName
Make and model for the printer IPP attributes are extracted from the PPD's NickName, which sometimes misses the manufacturer's name. Extract it from the PPD's Manufacturer field or derive it from the model name if possible. Enhanced alternative for pull request #21.Makefile.am
: Fix disablingtestppdfile
Missing conditionals made the binary built when disabled (Pull request #18).
libppd 2.0rc2
Bug fixes following first bug reports from Ubuntu 23.04 and Fedora 38 users, first distros with libcupsfilters 2.0rc1, and also synced the code with current CUPS, 3 years after it was spun out, adding a lot more bug fixes and some extra PPD attributes in auto-generated PPDs to make full use of CUPS' functionality:
ppdFilterPSToPS()
: Fixed reverse output order.
When converting the formerpstops
CUPS filter into the filter function, some function calls got wrongly replaced by new ones, resulting in no output at all when the input should be re-arranged into reverse order. This broke printing with all PostScript printers (and proprietary CUPS drivers needing PostScript as input) which do reverse-order by default (Issue #20, Ubuntu bug #2022943).- Fixed resolution handling when converting PPDs to printer IPP attributes
For PWG/Apple Raster or PCLm output resolutions in job options or pseudo-PostScript code in the PPD get ignored and instead, the lowest resolution of the description of the Raster format used in the PPD file gets always used, which reduced output quality (Ubuntu bug #2022929). ppdFilterLoadPPD()
: Actually create sample Raster header also for Apple/PWG Raster- All PPD files with "MirrorPrint" option cuased mirrored printout
If a PPD contains an option "MirrorPrint", theppdFilterLoadPPD()
sent the optionmirror=true
to the filter functions, regardless of the actual setting of "MirrorPrint" (which is usually "False" by default), making all jobs coming out with mirrored pages (Ubuntu bug #2018538). - PPD file generator: Put
*cupsSingleFile: True
into generated PPD as some driverless IPP printers do not support multi-file jobs (CUPS issue #643). - Add CUPS PPD attributes
*cupsLanguages: ...
and*cupsStringsURI ...
to generated PPDs so that CUPS loads printer-specific option names and translations from the printer and uses them without need of static translations in the PPD file. - CUPS renames the PPD option choice name "Custom" to "_Custom" when a fixed choice is named as such, to distinguish from CUPS' facility for custom option values. We do now the same when loading PPD files.
- Prevent duplicate PPD->IPP media-type name mappings, now we do not have dropping of some media types in the Printer Applications any more.
- When not specifying a media source and the page size is small (5x7" or smaller) do not request the photo tray but
auto
instead. - Do not override color settings from print dialog ("ColorModel") with
print-color-mode
setting. - Make
ppdFilterPSToPS()
recognize%%PageRequirements:
DSC comment. - Correctly display "Xprinter" instead of Xerox for Xprinter devices
- Fix the
job-pages-per-set
value (used to apply finishings correctly) for duplex and N-up printing. - Make the
testppd
build test program also work if it is started from an environment with non-English locale. - Minor bug fixes, silencing warnings (especially of clang), fixing typos in comments, coding style, ..., and also some fixes for memory leaks.
libppd 2.0rc1
Release Candidate: Bug fixes to make driverless color printers print in color by default, CUPS filters not choke on PPDs with duplicate page sizes, and the testppdfile
utility get installed.
- PPD generator for driverless printers: Set default color mode when printer attrs say "auto"
Actual printer default color mode did not get set and then often "Gray" got set for color printers. Now we always choose the "best" mode (Ubuntu bug 2014976). ppdLoadAttributes()
: Find default page size also by dimensions
Some PPDs can contain the same page size twice with different names, whereas the PWG cache created from the PPD contains each size only once. This could make the default size not being found when the PPD is converted to IPP attributes. Now we search also by size and not only by name (Caused Ubuntu bug 2013131).- PPD generator for driverless printers: Add
*LandscapeOrientation:
according to thelandscape-orientation-requested-preferred
printer IPP attribute. ppdFilterLoadPPD()
: Corrected PPD attribute name so that for printers which receive PWG Raster a sample Raster header gets created.- Make the
testppdfile
utility getting built and installed by default. - Improved formatting of reports generated by
ppdTest()
.
libppd 2.0b4
Adde cupstestppd
functionality, Coverity scan and fixes, several other bug fixes
- Transfer CUPS'
cupstestppd
utility toppdTest()
library function
The valuable tool got forgotten in the first place, now it is available asppdTest()
library function andtestppdfile
command line utility. The command line utility only gets installed with./configure
called with--enable-testppdfile
argument. - In auto-generated PPDs do not set RGB default on mono printers (CUPS Issue #614)
When a PPD for a driverless printer is generated by theppdCreatePPDFromIPP()
function and the get-printer-attributes IPP response gives "print-color-mode-default=auto" the PPD's default setting for "ColorModel" is always "RGB", even on monochrome printers, which makes printing fail on most devices. Now we ignore the "print-color-mode-default" if set to "auto". - ppdLoadAttributes(): Added NULL check for missing PPD PageSize default
Some PPDs, even "everywhere" PPDs generated by CUPS for a driverless IPP printer do not have a valid default value for the default page size, like "Unknown". Added a NULL check to avoid a crash by such PPD files. - Coverity check done by Zdenek Dohnal for the inclusion of libppd
in Fedora and Red Hat. Zdenek has fixed all the issues: Missingfree()
, potential string overflows, ... Thanks a lot! testppd
: String got freed too early
In this test program run bymake check
a string was used after already gotten freed. Discovered via a compiler warning, but program could have actually crashed.configure.ac
: Change deprecatedAC_PROG_LIBTOOL
forLT_INIT
(PR #8)
libppd 2.0b3
Fixes of bugs found while packaging for distros, in the build system and the source code documentation
COPYING
,NOTICE
: Simplification for autotools-generated files autotools-generated files can be included under the license of the upstream code, and FSF copyright added to upstream copyright list. SimplifiedCOPYING
appropriately.Makefile.am
: IncludeLICENSE
in distribution tarball
libppd 2.0b2
Second beta release approaching libppd 2.0.0: Support for more than 2 resolutions in Apple Raster/AirPrint, fixed crash when filter functions are called without supplying PPD file, adapted to libcupsfilters cfCatalog...()
API correction, tons of fixes in source code documentation and build system
- PPD file generator for driverless printing with CUPS: Support more than 2 resolutions in Apple Raster/AirPrint. The
urf-supported
IPP attribute was only parsed correctly when itsRS
part had only 1 or 2 and not more resolutions specified. This commit corrects now for an arbitrary amount of resolutions, taking the lowest for "draft", the highest for "high" and one in the middle for "normal" print quality (PR #3). - Update
cfCatalogLoad()
calls for API change in libcupsfilters. In libcupsfilters we have added language/translation support to thecfCatalog...()
API functions via OpenPrinting/libcupsfilters#2. This changes thecfCatalogLoad()
calls in libppd (both in the PPD generator for driverless printing). For a quick solution we supply NULL as language for now, resembling the old behavior. We look into language support in the PPD generator later (PR #4). ppdFilterEmitJCL()
: Added NULL check for PPD not being supplied. Classic CUPS filters created based on filter functions usingppdFilterCUPSWrapper()
and also filter functions of libppd (ppdFilter...()
) should also work without PPD file and not crash if no PPD file is supplied.- Make build of
genstrings
optional.
genstrings
is only a development tool for the PPD compiler, not a user tool, therefore we make its build optional. It can be built viamake genstrings
or the./configure
option--enable-genstrings
. Makefile.am
: Include NOTICE in distribution tarballconfigure.ac
: Addedforeign
to toAM_INIT_AUTOMAKE()
call. Makes automake not require a file namedREADME
.- Cleaned up
.gitignore
- Tons of fixes in the source code documentation:
README.md
,INSTALL
,DEVELOPING.md
,CONTRIBUTING.md
,COPYING
,NOTICE
, ... Adapted to the libppd component, added links.
libppd 2.0b1
First beta release approaching libppd 2.0.0, for retro-fitting classic CUPS drivers/PPD files on systems using the New Architecture for printing and scanning.
- Introduced the new libppd library overtaking all the PPD handling functions from libcups, CUPS' ppdc utility (PPD compiler using *.drv files), and the PPD file collection handling functionality from cups-driverd, as they are deprecated there and will get removed in CUPS 3.x. This form of conservation is mainly intended for converting classic printer drivers which use PPDs into Printer Applications without completely rewriting them.
- Added functions
ppdLoadAttributes()
,ppdFilterLoadPPD()
,ppdFilterLoadPPDFile()
,ppdFilterFreePPD()
, andppdFilterFreePPDFile()
to convert all PPD file options and settings relevant for the filter functions in libcupsfilters into printer IPP attributes and options. Also create a named ("libppd") extension in the filter data structure, for filter functions explicitly supporting PPD files. - Added
ppdFilterCUPSWrapper()
convenience function to easily create a classic CUPS filter from a filter function. - Converted the
...tops
CUPS filters into the filter functionsppdFilterPDFToPS()
, andppdFilterRasterToPS()
. As PostScript as print output format is as deprecated as PPD files and all PostScript printers use PPD files, we move PostScript output generation to libppd, too. - Converted CUPS'
pstops
filter into theppdFilterPSToPS()
filter function. - Introduced
ppdFilterImageToPS()
filter function for Printer Applications to print on PostScript printers. It is used to print images (IPP standard requires at least JPEG to be accepted) without need of a PDF renderer (cfFilterImageToPDF()
->cfFilterPDFToPS()
) and without need to convert to Raster (cfFilterImageToRaster()
->cfFilterRasterToPS()
). - Created wrappers to add PPD-defined JCL code to jobs for native PDF printers,
ppdFilterImageToPDF()
andppdFilterPDFToPDF()
filter functions with the underlyingppdFilterEmitJCL()
function. - Created
ppdFilterUniversal()
wrapper function forcfFilterUniversal()
to add PPD file support, especially for PPD files which define driver filters. ppdFilterExternalCUPS()
wrapper function forcfFilterExternal()
to add PPD file support.- Auto-pre-fill the presets with most suitable options from the PPD files with new
ppdCacheAssignPresets()
function (Only if not filled via "APPrinterPreset
" in the PPD). This way we can use the IPP optionsprint-color-mode
,print-quality
, andprint-content-optimize
in a PPD/CUPS-driver-retro-fitting Printer Application with most PPDs. - In
ppdCacheCreateWithPPD()
also support presets forprint-content-optimize
, not only forprint-color-mode
andprint-quality
. - In the
ppdCacheGetPageSize()
function do not only check the fit of the margins with the page size matching the job's page size (like "A4") but also the margins of the variants (like "A4.Borderless"), even if the variant's size dimensions differ from the base size (and the physical paper size), for example for overspray in borderless printing mode (HPLIP does this). Also select a borderless variant only if the job requests borderless (all margins zero). - Move the functions
ppdPwgUnppdizeName()
,ppdPwgPpdizeName()
, andppdPwgPpdizeResolution()
into the public API. - In the
ppdPwgUnppdizeName()
allow to supply NULL as the list of characters to replace by dashes. Then all non-alpha-numeric characters get replaced, to result in IPP-conforming keyword strings. - In the
ppdPwgUnppdizeName()
function support negative numbers ppdFilterPSToPS()
: Introduced newinput-page-ranges
attribute (Issue #365, Pull request #444, #445).- Changed
ColorModel
option in the PPDs from the PPD generator to mirror theprint-color-mode
IPP attribute instead of providing all color space/depth combos for manual selection. Color space and depth are now auto-selected by theurf-supported
andpwg-raster-document-type-supported
printer IPP attributes and the settings ofprint-color-mode
andprint-quality
. This is now implemented in thecfFilterGhostscript()
filter function both for use of the auto-generated PPD file for driverless iPP printers and use without PPD, based on IPP attributes. For this the new library functionscupsRasterPrepareHeader()
to create a header for Raster output andcupsRasterSetColorSpace()
to auto-select color space and depth were created. - Clean-up of human-readable string handling in the PPD generator.
- Removed support for asymmetric image resolutions ("ppi=XXXxYYY") in
cfFilterImageToPS()
as CUPS does not support this (Issue #347, Pull request #361, OpenPrinting CUPS issue #115). - Removed versioning.h and the macros defined in this file (Issue #334).
- Removed
ppdCreateFromIPPCUPS()
, we have a better one in libppd. Also removed corresponding test intestppd
. - Build system, README: Require CUPS 2.2.2+.
- Build system: Remove '-D_PPD_DEPRECATED=""' from the compiling command lines of the source files which use libcups. The flag is not supported any more for longer times already and all the PPD-related functions deprecated by CUPS have moved into libppd now.
- Added support for Sharp-proprietary
ARDuplex
PPD option name for double-sided printing. - Build system: Add files in
.gitignore
that are generated byautogen.sh
,configure
, andmake
(Pull request #336). - Fixed PPD memory leak caused by "emulators" field not freed (OpenPrinting CUPS issue #124).
- Make "True" in boolean options case-insensitive (OpenPrinting CUPS pull request #106).