--- Begin Message ---
Package: release.debian.org
Severity: normal
User: release.debian.org@packages.debian.org
Usertags: unblock
Please unblock package cups 2.2.10-5
Actually; to be entirely transparent, I uploaded to unstable by mistake; I had
considered the changes not to warrant going through an unblock process. Anyway.
The changes are non-invasive and non-risky, extend hardware support, and
(well), they sit in unstable. :-)
Don't hesitate to ask me for a revert, I'm glad to do so.
The real debdiff is attached, but given my use of git-dpm, is quite noisy. The
real "source diff" is the following (in short, two org.cups.usb-quirks
additions and a manpage translation update):
diff -Nru cups-2.2.10/debian/changelog cups-2.2.10/debian/changelog
--- cups-2.2.10/debian/changelog 2019-02-16 14:48:42.000000000 +0100
+++ cups-2.2.10/debian/changelog 2019-03-27 17:13:07.000000000 +0100
@@ -1,3 +1,15 @@
+cups (2.2.10-5) unstable; urgency=medium
+
+ [ Helge Kreutzmann ]
+ * Correct error in german manpage translation
+
+ [ Didier Raboud ]
+ * Backport patches from upstream's 2.2 "stable" branch:
+ - Add USB quirks rule for Xerox printers (Issue #5523)
+ - Add a USB quirks rule for the DYMO 450 Turbo (Issue #5521)
+
+ -- Didier Raboud <odyx@debian.org> Wed, 27 Mar 2019 17:13:07 +0100
+
cups (2.2.10-4) unstable; urgency=low
* Backport patches from upstream's 2.2 "stable" branch:
diff -Nru cups-2.2.10/debian/manpage-po4a/po/de.po cups-2.2.10/debian/manpage-po4a/po/de.po
--- cups-2.2.10/debian/manpage-po4a/po/de.po 2019-02-16 14:48:42.000000000 +0100
+++ cups-2.2.10/debian/manpage-po4a/po/de.po 2019-03-27 17:13:07.000000000 +0100
@@ -12,7 +12,7 @@
msgstr ""
"Project-Id-Version: cups man pages 2.2.7-5\n"
"POT-Creation-Date: 2018-12-08 12:54+0100\n"
-"PO-Revision-Date: 2018-12-09 06:47+0100\n"
+"PO-Revision-Date: 2019-03-03 07:38+0100\n"
"Last-Translator: Helge Kreutzmann <debian@helgefjell.de>\n"
"Language-Team: de <debian-l10n-german@lists.debian.org>\n"
"Language: de\n"
@@ -2210,7 +2210,7 @@
msgstr ""
"Die Datei I<cupsd.conf> konfiguriert den CUPS-Auftragsplaner (Scheduler), "
"B<cupsd>(8). Sie befindet sich normalerweise in dem Verzeichnis I</etc/"
-"cups>. B<Hinweis:> Datei, Verzeichnis und Benutzerkonfigurationsdirektiven, "
+"cups>. B<Hinweis:> Datei-, Verzeichnis- und Benutzerkonfigurationsdirektiven, "
"die früher in der Datei B<cupsd.conf> erlaubt wurden, werden jetzt "
"stattdessen in der Datei B<cups-files.conf>(5) gespeichert, um bestimmte "
"Arten von Angriffen zur Rechteerweiterung zu vermeiden."
diff -Nru cups-2.2.10/debian/patches/0040-Add-USB-quirks-rule-for-Xerox-printers-Issue-5523.patch cups-2.2.10/debian/patches/0040-Add-USB-quirks-rule-for-Xerox-printers-Issue-5523.patch
--- cups-2.2.10/debian/patches/0040-Add-USB-quirks-rule-for-Xerox-printers-Issue-5523.patch 1970-01-01 01:00:00.000000000 +0100
+++ cups-2.2.10/debian/patches/0040-Add-USB-quirks-rule-for-Xerox-printers-Issue-5523.patch 2019-03-27 17:13:07.000000000 +0100
@@ -0,0 +1,20 @@
+From f8eac850dfbdb4a8d6a02f4d5eb2a473e7b088b4 Mon Sep 17 00:00:00 2001
+From: Michael R Sweet <michael.r.sweet@gmail.com>
+Date: Tue, 19 Feb 2019 11:11:54 -0500
+Subject: Add USB quirks rule for Xerox printers (Issue #5523)
+
+---
+ backend/org.cups.usb-quirks | 3 +++
+ 1 file changed, 3 insertions(+)
+
+diff --git a/backend/org.cups.usb-quirks b/backend/org.cups.usb-quirks
+index 0586602ab..77233ea18 100644
+--- a/backend/org.cups.usb-quirks
++++ b/backend/org.cups.usb-quirks
+@@ -293,3 +293,6 @@
+
+ # Lexmark E120n (Issue #5478)
+ 0x043d 0x00cc no-reattach
++
++# All Xerox printers (Issue #5523)
++0x0924 no-reattach
diff -Nru cups-2.2.10/debian/patches/0041-Add-a-USB-quirks-rule-for-the-DYMO-450-Turbo-Issue-5.patch cups-2.2.10/debian/patches/0041-Add-a-USB-quirks-rule-for-the-DYMO-450-Turbo-Issue-5.patch
--- cups-2.2.10/debian/patches/0041-Add-a-USB-quirks-rule-for-the-DYMO-450-Turbo-Issue-5.patch 1970-01-01 01:00:00.000000000 +0100
+++ cups-2.2.10/debian/patches/0041-Add-a-USB-quirks-rule-for-the-DYMO-450-Turbo-Issue-5.patch 2019-03-27 17:13:07.000000000 +0100
@@ -0,0 +1,20 @@
+From d4d7ff4dad47ad4d278ca2c84efd602354a4e627 Mon Sep 17 00:00:00 2001
+From: Michael R Sweet <michael.r.sweet@gmail.com>
+Date: Thu, 21 Feb 2019 09:54:59 -0500
+Subject: Add a USB quirks rule for the DYMO 450 Turbo (Issue #5521)
+
+---
+ backend/org.cups.usb-quirks | 3 +++
+ 1 file changed, 3 insertions(+)
+
+diff --git a/backend/org.cups.usb-quirks b/backend/org.cups.usb-quirks
+index 77233ea18..44d6bb8cb 100644
+--- a/backend/org.cups.usb-quirks
++++ b/backend/org.cups.usb-quirks
+@@ -296,3 +296,6 @@
+
+ # All Xerox printers (Issue #5523)
+ 0x0924 no-reattach
++
++# Dymo 450 Turbo (Issue #5521)
++0x0922 0x0021 unidir
diff -Nru cups-2.2.10/debian/patches/series cups-2.2.10/debian/patches/series
--- cups-2.2.10/debian/patches/series 2019-02-16 14:48:42.000000000 +0100
+++ cups-2.2.10/debian/patches/series 2019-03-27 17:13:07.000000000 +0100
@@ -37,7 +37,9 @@
0037-Use-the-same-requested-attributes-values-for-all-IPP.patch
0038-Add-a-USB-quirk-rule-for-the-Lexmark-E120n-Issue-547.patch
0039-Updated-the-USB-quirks-rule-for-Zebra-label-printers.patch
-0040-Fix-compile-error-on-Linux-Issue-5483.patch
-0041-Stop-parsing-the-Emulators-keywords-in-PPD-files-Iss.patch
-0042-Fix-potential-unaligned-accesses-in-the-string-pool-.patch
+0040-Add-USB-quirks-rule-for-Xerox-printers-Issue-5523.patch
+0041-Add-a-USB-quirks-rule-for-the-DYMO-450-Turbo-Issue-5.patch
+0042-Fix-compile-error-on-Linux-Issue-5483.patch
+0043-Stop-parsing-the-Emulators-keywords-in-PPD-files-Iss.patch
+0044-Fix-potential-unaligned-accesses-in-the-string-pool-.patch
manpage-translations.patch
unblock cups/2.2.10-5
-- System Information:
Debian Release: buster/sid
APT prefers buildd-unstable
APT policy: (990, 'buildd-unstable'), (500, 'unstable-debug'), (500, 'unstable'), (500, 'testing'), (500, 'stable'), (100, 'experimental'), (1, 'experimental-debug')
Architecture: amd64 (x86_64)
Foreign Architectures: i386
Kernel: Linux 4.19.0-4-amd64 (SMP w/4 CPU cores)
Kernel taint flags: TAINT_OOT_MODULE, TAINT_UNSIGNED_MODULE
Locale: LANG=fr_CH.UTF-8, LC_CTYPE=fr_CH.UTF-8 (charmap=UTF-8), LANGUAGE=fr_CH:fr (charmap=UTF-8)
Shell: /bin/sh linked to /usr/bin/dash
Init: systemd (via /run/systemd/system)
LSM: AppArmor: enabled
diff -Nru cups-2.2.10/debian/changelog cups-2.2.10/debian/changelog
--- cups-2.2.10/debian/changelog 2019-02-16 14:48:42.000000000 +0100
+++ cups-2.2.10/debian/changelog 2019-03-27 17:13:07.000000000 +0100
@@ -1,3 +1,15 @@
+cups (2.2.10-5) unstable; urgency=medium
+
+ [ Helge Kreutzmann ]
+ * Correct error in german manpage translation
+
+ [ Didier Raboud ]
+ * Backport patches from upstream's 2.2 "stable" branch:
+ - Add USB quirks rule for Xerox printers (Issue #5523)
+ - Add a USB quirks rule for the DYMO 450 Turbo (Issue #5521)
+
+ -- Didier Raboud <odyx@debian.org> Wed, 27 Mar 2019 17:13:07 +0100
+
cups (2.2.10-4) unstable; urgency=low
* Backport patches from upstream's 2.2 "stable" branch:
diff -Nru cups-2.2.10/debian/.git-dpm cups-2.2.10/debian/.git-dpm
--- cups-2.2.10/debian/.git-dpm 2019-02-16 14:48:42.000000000 +0100
+++ cups-2.2.10/debian/.git-dpm 2019-03-27 17:13:07.000000000 +0100
@@ -1,6 +1,6 @@
# see git-dpm(1) from git-dpm package
-3a541d1cb57989a954984fb70ba5e45a65eeeaa6
-3a541d1cb57989a954984fb70ba5e45a65eeeaa6
+2fb6d0075ed13f2fd03a8600a6ecb0892818116b
+2fb6d0075ed13f2fd03a8600a6ecb0892818116b
25b2338346ef3abbb93ea88476887cba7b2b86f8
25b2338346ef3abbb93ea88476887cba7b2b86f8
cups_2.2.10.orig.tar.gz
diff -Nru cups-2.2.10/debian/manpage-po4a/po/de.po cups-2.2.10/debian/manpage-po4a/po/de.po
--- cups-2.2.10/debian/manpage-po4a/po/de.po 2019-02-16 14:48:42.000000000 +0100
+++ cups-2.2.10/debian/manpage-po4a/po/de.po 2019-03-27 17:13:07.000000000 +0100
@@ -12,7 +12,7 @@
msgstr ""
"Project-Id-Version: cups man pages 2.2.7-5\n"
"POT-Creation-Date: 2018-12-08 12:54+0100\n"
-"PO-Revision-Date: 2018-12-09 06:47+0100\n"
+"PO-Revision-Date: 2019-03-03 07:38+0100\n"
"Last-Translator: Helge Kreutzmann <debian@helgefjell.de>\n"
"Language-Team: de <debian-l10n-german@lists.debian.org>\n"
"Language: de\n"
@@ -2210,7 +2210,7 @@
msgstr ""
"Die Datei I<cupsd.conf> konfiguriert den CUPS-Auftragsplaner (Scheduler), "
"B<cupsd>(8). Sie befindet sich normalerweise in dem Verzeichnis I</etc/"
-"cups>. B<Hinweis:> Datei, Verzeichnis und Benutzerkonfigurationsdirektiven, "
+"cups>. B<Hinweis:> Datei-, Verzeichnis- und Benutzerkonfigurationsdirektiven, "
"die früher in der Datei B<cupsd.conf> erlaubt wurden, werden jetzt "
"stattdessen in der Datei B<cups-files.conf>(5) gespeichert, um bestimmte "
"Arten von Angriffen zur Rechteerweiterung zu vermeiden."
diff -Nru cups-2.2.10/debian/patches/0040-Add-USB-quirks-rule-for-Xerox-printers-Issue-5523.patch cups-2.2.10/debian/patches/0040-Add-USB-quirks-rule-for-Xerox-printers-Issue-5523.patch
--- cups-2.2.10/debian/patches/0040-Add-USB-quirks-rule-for-Xerox-printers-Issue-5523.patch 1970-01-01 01:00:00.000000000 +0100
+++ cups-2.2.10/debian/patches/0040-Add-USB-quirks-rule-for-Xerox-printers-Issue-5523.patch 2019-03-27 17:13:07.000000000 +0100
@@ -0,0 +1,20 @@
+From f8eac850dfbdb4a8d6a02f4d5eb2a473e7b088b4 Mon Sep 17 00:00:00 2001
+From: Michael R Sweet <michael.r.sweet@gmail.com>
+Date: Tue, 19 Feb 2019 11:11:54 -0500
+Subject: Add USB quirks rule for Xerox printers (Issue #5523)
+
+---
+ backend/org.cups.usb-quirks | 3 +++
+ 1 file changed, 3 insertions(+)
+
+diff --git a/backend/org.cups.usb-quirks b/backend/org.cups.usb-quirks
+index 0586602ab..77233ea18 100644
+--- a/backend/org.cups.usb-quirks
++++ b/backend/org.cups.usb-quirks
+@@ -293,3 +293,6 @@
+
+ # Lexmark E120n (Issue #5478)
+ 0x043d 0x00cc no-reattach
++
++# All Xerox printers (Issue #5523)
++0x0924 no-reattach
diff -Nru cups-2.2.10/debian/patches/0040-Fix-compile-error-on-Linux-Issue-5483.patch cups-2.2.10/debian/patches/0040-Fix-compile-error-on-Linux-Issue-5483.patch
--- cups-2.2.10/debian/patches/0040-Fix-compile-error-on-Linux-Issue-5483.patch 2019-02-16 14:48:42.000000000 +0100
+++ cups-2.2.10/debian/patches/0040-Fix-compile-error-on-Linux-Issue-5483.patch 1970-01-01 01:00:00.000000000 +0100
@@ -1,31 +0,0 @@
-From 6a6ba891dfe51dcfda58bfebf71f3bbbcb014583 Mon Sep 17 00:00:00 2001
-From: Michael R Sweet <michael.r.sweet@gmail.com>
-Date: Mon, 21 Jan 2019 11:54:58 -0500
-Subject: Fix compile error on Linux (Issue #5483)
-
----
- cups/hash.c | 4 ++--
- 1 file changed, 2 insertions(+), 2 deletions(-)
-
-diff --git a/cups/hash.c b/cups/hash.c
-index 50dc5fb30..a31372595 100644
---- a/cups/hash.c
-+++ b/cups/hash.c
-@@ -1,7 +1,7 @@
- /*
- * Hashing function for CUPS.
- *
-- * Copyright © 2015-2018 by Apple Inc.
-+ * Copyright © 2015-2019 by Apple Inc.
- *
- * These coded instructions, statements, and computer programs are the
- * property of Apple Inc. and are protected by Federal copyright
-@@ -235,7 +235,7 @@ cupsHashData(const char *algorithm, /* I - Algorithm name */
-
- gnutls_hash_fast(alg, data, datalen, hash);
-
-- return (gnutls_hash_get_len(alg));
-+ return ((ssize_t)gnutls_hash_get_len(alg));
- }
-
- #else
diff -Nru cups-2.2.10/debian/patches/0041-Add-a-USB-quirks-rule-for-the-DYMO-450-Turbo-Issue-5.patch cups-2.2.10/debian/patches/0041-Add-a-USB-quirks-rule-for-the-DYMO-450-Turbo-Issue-5.patch
--- cups-2.2.10/debian/patches/0041-Add-a-USB-quirks-rule-for-the-DYMO-450-Turbo-Issue-5.patch 1970-01-01 01:00:00.000000000 +0100
+++ cups-2.2.10/debian/patches/0041-Add-a-USB-quirks-rule-for-the-DYMO-450-Turbo-Issue-5.patch 2019-03-27 17:13:07.000000000 +0100
@@ -0,0 +1,20 @@
+From d4d7ff4dad47ad4d278ca2c84efd602354a4e627 Mon Sep 17 00:00:00 2001
+From: Michael R Sweet <michael.r.sweet@gmail.com>
+Date: Thu, 21 Feb 2019 09:54:59 -0500
+Subject: Add a USB quirks rule for the DYMO 450 Turbo (Issue #5521)
+
+---
+ backend/org.cups.usb-quirks | 3 +++
+ 1 file changed, 3 insertions(+)
+
+diff --git a/backend/org.cups.usb-quirks b/backend/org.cups.usb-quirks
+index 77233ea18..44d6bb8cb 100644
+--- a/backend/org.cups.usb-quirks
++++ b/backend/org.cups.usb-quirks
+@@ -296,3 +296,6 @@
+
+ # All Xerox printers (Issue #5523)
+ 0x0924 no-reattach
++
++# Dymo 450 Turbo (Issue #5521)
++0x0922 0x0021 unidir
diff -Nru cups-2.2.10/debian/patches/0041-Stop-parsing-the-Emulators-keywords-in-PPD-files-Iss.patch cups-2.2.10/debian/patches/0041-Stop-parsing-the-Emulators-keywords-in-PPD-files-Iss.patch
--- cups-2.2.10/debian/patches/0041-Stop-parsing-the-Emulators-keywords-in-PPD-files-Iss.patch 2019-02-16 14:48:42.000000000 +0100
+++ cups-2.2.10/debian/patches/0041-Stop-parsing-the-Emulators-keywords-in-PPD-files-Iss.patch 1970-01-01 01:00:00.000000000 +0100
@@ -1,159 +0,0 @@
-From 4e956a93177237e3fd75574efb0bb1d6ae017e5c Mon Sep 17 00:00:00 2001
-From: Michael R Sweet <michael.r.sweet@gmail.com>
-Date: Mon, 21 Jan 2019 13:44:43 -0500
-Subject: Stop parsing the Emulators keywords in PPD files (Issue #5475)
-
-This also addresses a potential memory leak...
----
- cups/ppd.c | 76 ++----------------------------------------------------
- cups/ppd.h | 8 +++---
- 2 files changed, 6 insertions(+), 78 deletions(-)
-
-diff --git a/cups/ppd.c b/cups/ppd.c
-index 5f27484aa..968ea8bf3 100644
---- a/cups/ppd.c
-+++ b/cups/ppd.c
-@@ -1,8 +1,8 @@
- /*
- * PPD file routines for CUPS.
- *
-- * Copyright 2007-2018 by Apple Inc.
-- * Copyright 1997-2007 by Easy Software Products, all rights reserved.
-+ * Copyright © 2007-2019 by Apple Inc.
-+ * Copyright © 1997-2007 by Easy Software Products, all rights reserved.
- *
- * These coded instructions, statements, and computer programs are the
- * property of Apple Inc. and are protected by Federal copyright
-@@ -117,7 +117,6 @@ void
- ppdClose(ppd_file_t *ppd) /* I - PPD file record */
- {
- int i; /* Looping var */
-- ppd_emul_t *emul; /* Current emulation */
- ppd_group_t *group; /* Current group */
- char **font; /* Current font */
- ppd_attr_t **attr; /* Current attribute */
-@@ -144,21 +143,6 @@ ppdClose(ppd_file_t *ppd) /* I - PPD file record */
- _cupsStrFree(ppd->jcl_end);
- _cupsStrFree(ppd->jcl_ps);
-
-- /*
-- * Free any emulations...
-- */
--
-- if (ppd->num_emulations > 0)
-- {
-- for (i = ppd->num_emulations, emul = ppd->emulations; i > 0; i --, emul ++)
-- {
-- _cupsStrFree(emul->start);
-- _cupsStrFree(emul->stop);
-- }
--
-- ppd_free(ppd->emulations);
-- }
--
- /*
- * Free any UI groups, subgroups, and options...
- */
-@@ -443,7 +427,6 @@ _ppdOpen(
- _ppd_localization_t localization) /* I - Localization to load */
- {
- int i, j, k; /* Looping vars */
-- int count; /* Temporary count */
- _ppd_line_t line; /* Line buffer */
- ppd_file_t *ppd; /* PPD file record */
- ppd_group_t *group, /* Current group */
-@@ -461,7 +444,6 @@ _ppdOpen(
- /* Human-readable text from file */
- *string, /* Code/text from file */
- *sptr, /* Pointer into string */
-- *nameptr, /* Pointer into name */
- *temp, /* Temporary string pointer */
- **tempfonts; /* Temporary fonts pointer */
- float order; /* Order dependency number */
-@@ -1203,60 +1185,6 @@ _ppdOpen(
- else if (!strcmp(string, "Plus90"))
- ppd->landscape = 90;
- }
-- else if (!strcmp(keyword, "Emulators") && string)
-- {
-- for (count = 1, sptr = string; sptr != NULL;)
-- if ((sptr = strchr(sptr, ' ')) != NULL)
-- {
-- count ++;
-- while (*sptr == ' ')
-- sptr ++;
-- }
--
-- ppd->num_emulations = count;
-- if ((ppd->emulations = calloc((size_t)count, sizeof(ppd_emul_t))) == NULL)
-- {
-- pg->ppd_status = PPD_ALLOC_ERROR;
--
-- goto error;
-- }
--
-- for (i = 0, sptr = string; i < count; i ++)
-- {
-- for (nameptr = ppd->emulations[i].name;
-- *sptr != '\0' && *sptr != ' ';
-- sptr ++)
-- if (nameptr < (ppd->emulations[i].name + sizeof(ppd->emulations[i].name) - 1))
-- *nameptr++ = *sptr;
--
-- *nameptr = '\0';
--
-- while (*sptr == ' ')
-- sptr ++;
-- }
-- }
-- else if (!strncmp(keyword, "StartEmulator_", 14))
-- {
-- ppd_decode(string);
--
-- for (i = 0; i < ppd->num_emulations; i ++)
-- if (!strcmp(keyword + 14, ppd->emulations[i].name))
-- {
-- ppd->emulations[i].start = string;
-- string = NULL;
-- }
-- }
-- else if (!strncmp(keyword, "StopEmulator_", 13))
-- {
-- ppd_decode(string);
--
-- for (i = 0; i < ppd->num_emulations; i ++)
-- if (!strcmp(keyword + 13, ppd->emulations[i].name))
-- {
-- ppd->emulations[i].stop = string;
-- string = NULL;
-- }
-- }
- else if (!strcmp(keyword, "JobPatchFile"))
- {
- /*
-diff --git a/cups/ppd.h b/cups/ppd.h
-index 6e628cb60..ae63c0d66 100644
---- a/cups/ppd.h
-+++ b/cups/ppd.h
-@@ -5,8 +5,8 @@
- * -D_PPD_DEPRECATED="" TO YOUR COMPILE OPTIONS. THIS HEADER AND THESE
- * FUNCTIONS WILL BE REMOVED IN A FUTURE RELEASE OF CUPS.
- *
-- * Copyright 2007-2015 by Apple Inc.
-- * Copyright 1997-2007 by Easy Software Products, all rights reserved.
-+ * Copyright © 2007-2019 by Apple Inc.
-+ * Copyright © 1997-2007 by Easy Software Products, all rights reserved.
- *
- * These coded instructions, statements, and computer programs are the
- * property of Apple Inc. and are protected by Federal copyright
-@@ -304,8 +304,8 @@ typedef struct ppd_file_s /**** PPD File ****/
- int throughput; /* Pages per minute */
- ppd_cs_t colorspace; /* Default colorspace */
- char *patches; /* Patch commands to be sent to printer */
-- int num_emulations; /* Number of emulations supported */
-- ppd_emul_t *emulations; /* Emulations and the code to invoke them */
-+ int num_emulations; /* Number of emulations supported (no longer supported) @private@ */
-+ ppd_emul_t *emulations; /* Emulations and the code to invoke them (no longer supported) @private@ */
- char *jcl_begin; /* Start JCL commands */
- char *jcl_ps; /* Enter PostScript interpreter */
- char *jcl_end; /* End JCL commands */
diff -Nru cups-2.2.10/debian/patches/0042-Fix-compile-error-on-Linux-Issue-5483.patch cups-2.2.10/debian/patches/0042-Fix-compile-error-on-Linux-Issue-5483.patch
--- cups-2.2.10/debian/patches/0042-Fix-compile-error-on-Linux-Issue-5483.patch 1970-01-01 01:00:00.000000000 +0100
+++ cups-2.2.10/debian/patches/0042-Fix-compile-error-on-Linux-Issue-5483.patch 2019-03-27 17:13:07.000000000 +0100
@@ -0,0 +1,31 @@
+From 6f2402e51d47e9cebe27eec5bfdb0e5543127e2a Mon Sep 17 00:00:00 2001
+From: Michael R Sweet <michael.r.sweet@gmail.com>
+Date: Mon, 21 Jan 2019 11:54:58 -0500
+Subject: Fix compile error on Linux (Issue #5483)
+
+---
+ cups/hash.c | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+diff --git a/cups/hash.c b/cups/hash.c
+index 50dc5fb30..a31372595 100644
+--- a/cups/hash.c
++++ b/cups/hash.c
+@@ -1,7 +1,7 @@
+ /*
+ * Hashing function for CUPS.
+ *
+- * Copyright © 2015-2018 by Apple Inc.
++ * Copyright © 2015-2019 by Apple Inc.
+ *
+ * These coded instructions, statements, and computer programs are the
+ * property of Apple Inc. and are protected by Federal copyright
+@@ -235,7 +235,7 @@ cupsHashData(const char *algorithm, /* I - Algorithm name */
+
+ gnutls_hash_fast(alg, data, datalen, hash);
+
+- return (gnutls_hash_get_len(alg));
++ return ((ssize_t)gnutls_hash_get_len(alg));
+ }
+
+ #else
diff -Nru cups-2.2.10/debian/patches/0042-Fix-potential-unaligned-accesses-in-the-string-pool-.patch cups-2.2.10/debian/patches/0042-Fix-potential-unaligned-accesses-in-the-string-pool-.patch
--- cups-2.2.10/debian/patches/0042-Fix-potential-unaligned-accesses-in-the-string-pool-.patch 2019-02-16 14:48:42.000000000 +0100
+++ cups-2.2.10/debian/patches/0042-Fix-potential-unaligned-accesses-in-the-string-pool-.patch 1970-01-01 01:00:00.000000000 +0100
@@ -1,1130 +0,0 @@
-From 285ff5788b33ae73ebf73656ceb9a6a912e0d0c9 Mon Sep 17 00:00:00 2001
-From: Michael R Sweet <michael.r.sweet@gmail.com>
-Date: Mon, 21 Jan 2019 14:21:57 -0500
-Subject: Fix potential unaligned accesses in the string pool (Issue #5474)
-
-This set of changes makes the PPD functions use strdup and free - they were
-modifying the contents of the string in places and doing other things that
-were not safe for (immutable) strings in the pool.
-
-Clean out some more _cupsStr cruft that might potentially cause an unaligned memory access (Issue #5474)
-
-Don't directly use the string pool in the CGI programs or scheduler.
----
- cgi-bin/admin.c | 12 ++---
- cgi-bin/var.c | 42 +++++++--------
- cups/ppd-cache.c | 134 +++++++++++++++++++++--------------------------
- cups/ppd-mark.c | 12 ++---
- cups/ppd.c | 115 ++++++++++++++++++++--------------------
- cups/string.c | 21 ++++----
- scheduler/ipp.c | 8 +--
- 7 files changed, 161 insertions(+), 183 deletions(-)
-
-diff --git a/cgi-bin/admin.c b/cgi-bin/admin.c
-index 690fbbc73..06199a96b 100644
---- a/cgi-bin/admin.c
-+++ b/cgi-bin/admin.c
-@@ -767,7 +767,7 @@ do_am_class(http_t *http, /* I - HTTP connection */
- attr = ippAddStrings(request, IPP_TAG_PRINTER, IPP_TAG_URI, "member-uris",
- num_printers, NULL, NULL);
- for (i = 0; i < num_printers; i ++)
-- attr->values[i].string.text = _cupsStrAlloc(cgiGetArray("MEMBER_URIS", i));
-+ ippSetString(request, &attr, i, cgiGetArray("MEMBER_URIS", i));
- }
-
- /*
-@@ -2417,7 +2417,7 @@ do_list_printers(http_t *http) /* I - HTTP connection */
- attr;
- attr = ippFindNextAttribute(response, "device-uri", IPP_TAG_URI))
- {
-- cupsArrayAdd(printer_devices, _cupsStrAlloc(attr->values[0].string.text));
-+ cupsArrayAdd(printer_devices, strdup(attr->values[0].string.text));
- }
-
- /*
-@@ -2555,7 +2555,7 @@ do_list_printers(http_t *http) /* I - HTTP connection */
- for (printer_device = (char *)cupsArrayFirst(printer_devices);
- printer_device;
- printer_device = (char *)cupsArrayNext(printer_devices))
-- _cupsStrFree(printer_device);
-+ free(printer_device);
-
- cupsArrayDelete(printer_devices);
- }
-@@ -2952,7 +2952,7 @@ do_set_allowed_users(http_t *http) /* I - HTTP connection */
- * Add the name...
- */
-
-- attr->values[i].string.text = _cupsStrAlloc(ptr);
-+ ippSetString(request, &attr, i, ptr);
-
- /*
- * Advance to the next name...
-@@ -3761,8 +3761,8 @@ do_set_options(http_t *http, /* I - HTTP connection */
-
- attr = ippAddStrings(request, IPP_TAG_PRINTER, IPP_TAG_NAME,
- "job-sheets-default", 2, NULL, NULL);
-- attr->values[0].string.text = _cupsStrAlloc(cgiGetVariable("job_sheets_start"));
-- attr->values[1].string.text = _cupsStrAlloc(cgiGetVariable("job_sheets_end"));
-+ ippSetString(request, &attr, 0, cgiGetVariable("job_sheets_start"));
-+ ippSetString(request, &attr, 1, cgiGetVariable("job_sheets_end"));
-
- if ((var = cgiGetVariable("printer_error_policy")) != NULL)
- ippAddString(request, IPP_TAG_PRINTER, IPP_TAG_NAME,
-diff --git a/cgi-bin/var.c b/cgi-bin/var.c
-index 579f23ba3..8b8f26472 100644
---- a/cgi-bin/var.c
-+++ b/cgi-bin/var.c
-@@ -1,8 +1,8 @@
- /*
- * CGI form variable and array functions for CUPS.
- *
-- * Copyright 2007-2015 by Apple Inc.
-- * Copyright 1997-2005 by Easy Software Products.
-+ * Copyright © 2007-2019 by Apple Inc.
-+ * Copyright © 1997-2005 by Easy Software Products.
- *
- * These coded instructions, statements, and computer programs are the
- * property of Apple Inc. and are protected by Federal copyright
-@@ -33,10 +33,10 @@
-
- typedef struct /**** Form variable structure ****/
- {
-- const char *name; /* Name of variable */
-+ char *name; /* Name of variable */
- int nvalues, /* Number of values */
- avalues; /* Number of values allocated */
-- const char **values; /* Value(s) of variable */
-+ char **values; /* Value(s) of variable */
- } _cgi_var_t;
-
-
-@@ -139,10 +139,10 @@ cgiClearVariables(void)
-
- for (v = form_vars, i = form_count; i > 0; v ++, i --)
- {
-- _cupsStrFree(v->name);
-+ free(v->name);
- for (j = 0; j < v->nvalues; j ++)
- if (v->values[j])
-- _cupsStrFree(v->values[j]);
-+ free(v->values[j]);
- }
-
- form_count = 0;
-@@ -168,7 +168,7 @@ cgiGetArray(const char *name, /* I - Name of array variable */
- if (element < 0 || element >= var->nvalues)
- return (NULL);
-
-- return (_cupsStrRetain(var->values[element]));
-+ return (strdup(var->values[element]));
- }
-
-
-@@ -234,7 +234,7 @@ cgiGetVariable(const char *name) /* I - Name of variable */
- var->values[var->nvalues - 1]));
- #endif /* DEBUG */
-
-- return ((var == NULL) ? NULL : _cupsStrRetain(var->values[var->nvalues - 1]));
-+ return ((var == NULL) ? NULL : strdup(var->values[var->nvalues - 1]));
- }
-
-
-@@ -382,10 +382,9 @@ cgiSetArray(const char *name, /* I - Name of variable */
- {
- if (element >= var->avalues)
- {
-- const char **temp; /* Temporary pointer */
-+ char **temp; /* Temporary pointer */
-
-- temp = (const char **)realloc((void *)(var->values),
-- sizeof(char *) * (size_t)(element + 16));
-+ temp = (char **)realloc((void *)(var->values), sizeof(char *) * (size_t)(element + 16));
- if (!temp)
- return;
-
-@@ -401,9 +400,9 @@ cgiSetArray(const char *name, /* I - Name of variable */
- var->nvalues = element + 1;
- }
- else if (var->values[element])
-- _cupsStrFree((char *)var->values[element]);
-+ free((char *)var->values[element]);
-
-- var->values[element] = _cupsStrAlloc(value);
-+ var->values[element] = strdup(value);
- }
- }
-
-@@ -460,10 +459,9 @@ cgiSetSize(const char *name, /* I - Name of variable */
-
- if (size >= var->avalues)
- {
-- const char **temp; /* Temporary pointer */
-+ char **temp; /* Temporary pointer */
-
-- temp = (const char **)realloc((void *)(var->values),
-- sizeof(char *) * (size_t)(size + 16));
-+ temp = (char **)realloc((void *)(var->values), sizeof(char *) * (size_t)(size + 16));
- if (!temp)
- return;
-
-@@ -480,7 +478,7 @@ cgiSetSize(const char *name, /* I - Name of variable */
- {
- for (i = size; i < var->nvalues; i ++)
- if (var->values[i])
-- _cupsStrFree((void *)(var->values[i]));
-+ free((void *)(var->values[i]));
- }
-
- var->nvalues = size;
-@@ -515,9 +513,9 @@ cgiSetVariable(const char *name, /* I - Name of variable */
- {
- for (i = 0; i < var->nvalues; i ++)
- if (var->values[i])
-- _cupsStrFree((char *)var->values[i]);
-+ free((char *)var->values[i]);
-
-- var->values[0] = _cupsStrAlloc(value);
-+ var->values[0] = strdup(value);
- var->nvalues = 1;
- }
- }
-@@ -563,10 +561,10 @@ cgi_add_variable(const char *name, /* I - Variable name */
- if ((var->values = calloc((size_t)element + 1, sizeof(char *))) == NULL)
- return;
-
-- var->name = _cupsStrAlloc(name);
-+ var->name = strdup(name);
- var->nvalues = element + 1;
- var->avalues = element + 1;
-- var->values[element] = _cupsStrAlloc(value);
-+ var->values[element] = strdup(value);
-
- form_count ++;
- }
-@@ -598,7 +596,7 @@ cgi_find_variable(const char *name) /* I - Name of variable */
- if (form_count < 1 || name == NULL)
- return (NULL);
-
-- key.name = name;
-+ key.name = (char *)name;
-
- return ((_cgi_var_t *)bsearch(&key, form_vars, (size_t)form_count, sizeof(_cgi_var_t),
- (int (*)(const void *, const void *))cgi_compare_variables));
-diff --git a/cups/ppd-cache.c b/cups/ppd-cache.c
-index ab91f0fd4..8b496e3b2 100644
---- a/cups/ppd-cache.c
-+++ b/cups/ppd-cache.c
-@@ -1,7 +1,7 @@
- /*
- * PPD cache implementation for CUPS.
- *
-- * Copyright © 2010-2018 by Apple Inc.
-+ * Copyright © 2010-2019 by Apple Inc.
- *
- * These coded instructions, statements, and computer programs are the
- * property of Apple Inc. and are protected by Federal copyright
-@@ -508,24 +508,20 @@ _ppdCacheCreateWithFile(
- else if (!_cups_strcasecmp(line, "Filter"))
- {
- if (!pc->filters)
-- pc->filters = cupsArrayNew3(NULL, NULL, NULL, 0,
-- (cups_acopy_func_t)_cupsStrAlloc,
-- (cups_afree_func_t)_cupsStrFree);
-+ pc->filters = cupsArrayNew3(NULL, NULL, NULL, 0, (cups_acopy_func_t)strdup, (cups_afree_func_t)free);
-
- cupsArrayAdd(pc->filters, value);
- }
- else if (!_cups_strcasecmp(line, "PreFilter"))
- {
- if (!pc->prefilters)
-- pc->prefilters = cupsArrayNew3(NULL, NULL, NULL, 0,
-- (cups_acopy_func_t)_cupsStrAlloc,
-- (cups_afree_func_t)_cupsStrFree);
-+ pc->prefilters = cupsArrayNew3(NULL, NULL, NULL, 0, (cups_acopy_func_t)strdup, (cups_afree_func_t)free);
-
- cupsArrayAdd(pc->prefilters, value);
- }
- else if (!_cups_strcasecmp(line, "Product"))
- {
-- pc->product = _cupsStrAlloc(value);
-+ pc->product = strdup(value);
- }
- else if (!_cups_strcasecmp(line, "SingleFile"))
- {
-@@ -625,8 +621,8 @@ _ppdCacheCreateWithFile(
- }
-
- map = pc->bins + pc->num_bins;
-- map->pwg = _cupsStrAlloc(pwg_keyword);
-- map->ppd = _cupsStrAlloc(ppd_keyword);
-+ map->pwg = strdup(pwg_keyword);
-+ map->ppd = strdup(ppd_keyword);
-
- pc->num_bins ++;
- }
-@@ -680,8 +676,8 @@ _ppdCacheCreateWithFile(
- goto create_error;
- }
-
-- size->map.pwg = _cupsStrAlloc(pwg_keyword);
-- size->map.ppd = _cupsStrAlloc(ppd_keyword);
-+ size->map.pwg = strdup(pwg_keyword);
-+ size->map.ppd = strdup(ppd_keyword);
-
- pc->num_sizes ++;
- }
-@@ -709,15 +705,15 @@ _ppdCacheCreateWithFile(
-
- pwgFormatSizeName(pwg_keyword, sizeof(pwg_keyword), "custom", "max",
- pc->custom_max_width, pc->custom_max_length, NULL);
-- pc->custom_max_keyword = _cupsStrAlloc(pwg_keyword);
-+ pc->custom_max_keyword = strdup(pwg_keyword);
-
- pwgFormatSizeName(pwg_keyword, sizeof(pwg_keyword), "custom", "min",
- pc->custom_min_width, pc->custom_min_length, NULL);
-- pc->custom_min_keyword = _cupsStrAlloc(pwg_keyword);
-+ pc->custom_min_keyword = strdup(pwg_keyword);
- }
- else if (!_cups_strcasecmp(line, "SourceOption"))
- {
-- pc->source_option = _cupsStrAlloc(value);
-+ pc->source_option = strdup(value);
- }
- else if (!_cups_strcasecmp(line, "NumSources"))
- {
-@@ -764,8 +760,8 @@ _ppdCacheCreateWithFile(
- }
-
- map = pc->sources + pc->num_sources;
-- map->pwg = _cupsStrAlloc(pwg_keyword);
-- map->ppd = _cupsStrAlloc(ppd_keyword);
-+ map->pwg = strdup(pwg_keyword);
-+ map->ppd = strdup(ppd_keyword);
-
- pc->num_sources ++;
- }
-@@ -813,8 +809,8 @@ _ppdCacheCreateWithFile(
- }
-
- map = pc->types + pc->num_types;
-- map->pwg = _cupsStrAlloc(pwg_keyword);
-- map->ppd = _cupsStrAlloc(ppd_keyword);
-+ map->pwg = strdup(pwg_keyword);
-+ map->ppd = strdup(ppd_keyword);
-
- pc->num_types ++;
- }
-@@ -844,13 +840,13 @@ _ppdCacheCreateWithFile(
- pc->presets[print_color_mode] + print_quality);
- }
- else if (!_cups_strcasecmp(line, "SidesOption"))
-- pc->sides_option = _cupsStrAlloc(value);
-+ pc->sides_option = strdup(value);
- else if (!_cups_strcasecmp(line, "Sides1Sided"))
-- pc->sides_1sided = _cupsStrAlloc(value);
-+ pc->sides_1sided = strdup(value);
- else if (!_cups_strcasecmp(line, "Sides2SidedLong"))
-- pc->sides_2sided_long = _cupsStrAlloc(value);
-+ pc->sides_2sided_long = strdup(value);
- else if (!_cups_strcasecmp(line, "Sides2SidedShort"))
-- pc->sides_2sided_short = _cupsStrAlloc(value);
-+ pc->sides_2sided_short = strdup(value);
- else if (!_cups_strcasecmp(line, "Finishings"))
- {
- if (!pc->finishings)
-@@ -871,13 +867,13 @@ _ppdCacheCreateWithFile(
- else if (!_cups_strcasecmp(line, "MaxCopies"))
- pc->max_copies = atoi(value);
- else if (!_cups_strcasecmp(line, "ChargeInfoURI"))
-- pc->charge_info_uri = _cupsStrAlloc(value);
-+ pc->charge_info_uri = strdup(value);
- else if (!_cups_strcasecmp(line, "JobAccountId"))
- pc->account_id = !_cups_strcasecmp(value, "true");
- else if (!_cups_strcasecmp(line, "JobAccountingUserId"))
- pc->accounting_user_id = !_cups_strcasecmp(value, "true");
- else if (!_cups_strcasecmp(line, "JobPassword"))
-- pc->password = _cupsStrAlloc(value);
-+ pc->password = strdup(value);
- else if (!_cups_strcasecmp(line, "Mandatory"))
- {
- if (pc->mandatory)
-@@ -888,9 +884,7 @@ _ppdCacheCreateWithFile(
- else if (!_cups_strcasecmp(line, "SupportFile"))
- {
- if (!pc->support_files)
-- pc->support_files = cupsArrayNew3(NULL, NULL, NULL, 0,
-- (cups_acopy_func_t)_cupsStrAlloc,
-- (cups_afree_func_t)_cupsStrFree);
-+ pc->support_files = cupsArrayNew3(NULL, NULL, NULL, 0, (cups_acopy_func_t)strdup, (cups_afree_func_t)free);
-
- cupsArrayAdd(pc->support_files, value);
- }
-@@ -1130,8 +1124,8 @@ _ppdCacheCreateWithPPD(ppd_file_t *ppd) /* I - PPD file */
- */
-
- new_size = old_size;
-- _cupsStrFree(old_size->map.ppd);
-- _cupsStrFree(old_size->map.pwg);
-+ free(old_size->map.ppd);
-+ free(old_size->map.pwg);
- }
- }
-
-@@ -1152,8 +1146,8 @@ _ppdCacheCreateWithPPD(ppd_file_t *ppd) /* I - PPD file */
- * Save this size...
- */
-
-- new_size->map.ppd = _cupsStrAlloc(ppd_size->name);
-- new_size->map.pwg = _cupsStrAlloc(pwg_name);
-+ new_size->map.ppd = strdup(ppd_size->name);
-+ new_size->map.pwg = strdup(pwg_name);
- new_size->width = new_width;
- new_size->length = new_length;
- new_size->left = new_left;
-@@ -1173,14 +1167,14 @@ _ppdCacheCreateWithPPD(ppd_file_t *ppd) /* I - PPD file */
- pwgFormatSizeName(pwg_keyword, sizeof(pwg_keyword), "custom", "max",
- PWG_FROM_POINTS(ppd->custom_max[0]),
- PWG_FROM_POINTS(ppd->custom_max[1]), NULL);
-- pc->custom_max_keyword = _cupsStrAlloc(pwg_keyword);
-+ pc->custom_max_keyword = strdup(pwg_keyword);
- pc->custom_max_width = PWG_FROM_POINTS(ppd->custom_max[0]);
- pc->custom_max_length = PWG_FROM_POINTS(ppd->custom_max[1]);
-
- pwgFormatSizeName(pwg_keyword, sizeof(pwg_keyword), "custom", "min",
- PWG_FROM_POINTS(ppd->custom_min[0]),
- PWG_FROM_POINTS(ppd->custom_min[1]), NULL);
-- pc->custom_min_keyword = _cupsStrAlloc(pwg_keyword);
-+ pc->custom_min_keyword = strdup(pwg_keyword);
- pc->custom_min_width = PWG_FROM_POINTS(ppd->custom_min[0]);
- pc->custom_min_length = PWG_FROM_POINTS(ppd->custom_min[1]);
-
-@@ -1199,7 +1193,7 @@ _ppdCacheCreateWithPPD(ppd_file_t *ppd) /* I - PPD file */
-
- if (input_slot)
- {
-- pc->source_option = _cupsStrAlloc(input_slot->keyword);
-+ pc->source_option = strdup(input_slot->keyword);
-
- if ((pc->sources = calloc((size_t)input_slot->num_choices, sizeof(pwg_map_t))) == NULL)
- {
-@@ -1251,8 +1245,8 @@ _ppdCacheCreateWithPPD(ppd_file_t *ppd) /* I - PPD file */
- "_");
- }
-
-- map->pwg = _cupsStrAlloc(pwg_name);
-- map->ppd = _cupsStrAlloc(choice->choice);
-+ map->pwg = strdup(pwg_name);
-+ map->ppd = strdup(choice->choice);
- }
- }
-
-@@ -1315,8 +1309,8 @@ _ppdCacheCreateWithPPD(ppd_file_t *ppd) /* I - PPD file */
- "_");
- }
-
-- map->pwg = _cupsStrAlloc(pwg_name);
-- map->ppd = _cupsStrAlloc(choice->choice);
-+ map->pwg = strdup(pwg_name);
-+ map->ppd = strdup(choice->choice);
- }
- }
-
-@@ -1342,8 +1336,8 @@ _ppdCacheCreateWithPPD(ppd_file_t *ppd) /* I - PPD file */
- {
- pwg_unppdize_name(choice->choice, pwg_keyword, sizeof(pwg_keyword), "_");
-
-- map->pwg = _cupsStrAlloc(pwg_keyword);
-- map->ppd = _cupsStrAlloc(choice->choice);
-+ map->pwg = strdup(pwg_keyword);
-+ map->ppd = strdup(choice->choice);
- }
- }
-
-@@ -1558,7 +1552,7 @@ _ppdCacheCreateWithPPD(ppd_file_t *ppd) /* I - PPD file */
-
- if (duplex)
- {
-- pc->sides_option = _cupsStrAlloc(duplex->keyword);
-+ pc->sides_option = strdup(duplex->keyword);
-
- for (i = duplex->num_choices, choice = duplex->choices;
- i > 0;
-@@ -1566,16 +1560,16 @@ _ppdCacheCreateWithPPD(ppd_file_t *ppd) /* I - PPD file */
- {
- if ((!_cups_strcasecmp(choice->choice, "None") ||
- !_cups_strcasecmp(choice->choice, "False")) && !pc->sides_1sided)
-- pc->sides_1sided = _cupsStrAlloc(choice->choice);
-+ pc->sides_1sided = strdup(choice->choice);
- else if ((!_cups_strcasecmp(choice->choice, "DuplexNoTumble") ||
- !_cups_strcasecmp(choice->choice, "LongEdge") ||
- !_cups_strcasecmp(choice->choice, "Top")) && !pc->sides_2sided_long)
-- pc->sides_2sided_long = _cupsStrAlloc(choice->choice);
-+ pc->sides_2sided_long = strdup(choice->choice);
- else if ((!_cups_strcasecmp(choice->choice, "DuplexTumble") ||
- !_cups_strcasecmp(choice->choice, "ShortEdge") ||
- !_cups_strcasecmp(choice->choice, "Bottom")) &&
- !pc->sides_2sided_short)
-- pc->sides_2sided_short = _cupsStrAlloc(choice->choice);
-+ pc->sides_2sided_short = strdup(choice->choice);
- }
- }
-
-@@ -1583,9 +1577,7 @@ _ppdCacheCreateWithPPD(ppd_file_t *ppd) /* I - PPD file */
- * Copy filters and pre-filters...
- */
-
-- pc->filters = cupsArrayNew3(NULL, NULL, NULL, 0,
-- (cups_acopy_func_t)_cupsStrAlloc,
-- (cups_afree_func_t)_cupsStrFree);
-+ pc->filters = cupsArrayNew3(NULL, NULL, NULL, 0, (cups_acopy_func_t)strdup, (cups_afree_func_t)free);
-
- cupsArrayAdd(pc->filters,
- "application/vnd.cups-raw application/octet-stream 0 -");
-@@ -1642,9 +1634,7 @@ _ppdCacheCreateWithPPD(ppd_file_t *ppd) /* I - PPD file */
-
- if ((ppd_attr = ppdFindAttr(ppd, "cupsPreFilter", NULL)) != NULL)
- {
-- pc->prefilters = cupsArrayNew3(NULL, NULL, NULL, 0,
-- (cups_acopy_func_t)_cupsStrAlloc,
-- (cups_afree_func_t)_cupsStrFree);
-+ pc->prefilters = cupsArrayNew3(NULL, NULL, NULL, 0, (cups_acopy_func_t)strdup, (cups_afree_func_t)free);
-
- do
- {
-@@ -1661,7 +1651,7 @@ _ppdCacheCreateWithPPD(ppd_file_t *ppd) /* I - PPD file */
- */
-
- if (ppd->product)
-- pc->product = _cupsStrAlloc(ppd->product);
-+ pc->product = strdup(ppd->product);
-
- /*
- * Copy finishings mapping data...
-@@ -1818,7 +1808,7 @@ _ppdCacheCreateWithPPD(ppd_file_t *ppd) /* I - PPD file */
- */
-
- if ((ppd_attr = ppdFindAttr(ppd, "cupsChargeInfoURI", NULL)) != NULL)
-- pc->charge_info_uri = _cupsStrAlloc(ppd_attr->value);
-+ pc->charge_info_uri = strdup(ppd_attr->value);
-
- if ((ppd_attr = ppdFindAttr(ppd, "cupsJobAccountId", NULL)) != NULL)
- pc->account_id = !_cups_strcasecmp(ppd_attr->value, "true");
-@@ -1827,7 +1817,7 @@ _ppdCacheCreateWithPPD(ppd_file_t *ppd) /* I - PPD file */
- pc->accounting_user_id = !_cups_strcasecmp(ppd_attr->value, "true");
-
- if ((ppd_attr = ppdFindAttr(ppd, "cupsJobPassword", NULL)) != NULL)
-- pc->password = _cupsStrAlloc(ppd_attr->value);
-+ pc->password = strdup(ppd_attr->value);
-
- if ((ppd_attr = ppdFindAttr(ppd, "cupsMandatory", NULL)) != NULL)
- pc->mandatory = _cupsArrayNewStrings(ppd_attr->value, ' ');
-@@ -1836,9 +1826,7 @@ _ppdCacheCreateWithPPD(ppd_file_t *ppd) /* I - PPD file */
- * Support files...
- */
-
-- pc->support_files = cupsArrayNew3(NULL, NULL, NULL, 0,
-- (cups_acopy_func_t)_cupsStrAlloc,
-- (cups_afree_func_t)_cupsStrFree);
-+ pc->support_files = cupsArrayNew3(NULL, NULL, NULL, 0, (cups_acopy_func_t)strdup, (cups_afree_func_t)free);
-
- for (ppd_attr = ppdFindAttr(ppd, "cupsICCProfile", NULL);
- ppd_attr;
-@@ -1894,8 +1882,8 @@ _ppdCacheDestroy(_ppd_cache_t *pc) /* I - PPD cache and mapping data */
- {
- for (i = pc->num_bins, map = pc->bins; i > 0; i --, map ++)
- {
-- _cupsStrFree(map->pwg);
-- _cupsStrFree(map->ppd);
-+ free(map->pwg);
-+ free(map->ppd);
- }
-
- free(pc->bins);
-@@ -1905,22 +1893,21 @@ _ppdCacheDestroy(_ppd_cache_t *pc) /* I - PPD cache and mapping data */
- {
- for (i = pc->num_sizes, size = pc->sizes; i > 0; i --, size ++)
- {
-- _cupsStrFree(size->map.pwg);
-- _cupsStrFree(size->map.ppd);
-+ free(size->map.pwg);
-+ free(size->map.ppd);
- }
-
- free(pc->sizes);
- }
-
-- if (pc->source_option)
-- _cupsStrFree(pc->source_option);
-+ free(pc->source_option);
-
- if (pc->sources)
- {
- for (i = pc->num_sources, map = pc->sources; i > 0; i --, map ++)
- {
-- _cupsStrFree(map->pwg);
-- _cupsStrFree(map->ppd);
-+ free(map->pwg);
-+ free(map->ppd);
- }
-
- free(pc->sources);
-@@ -1930,26 +1917,23 @@ _ppdCacheDestroy(_ppd_cache_t *pc) /* I - PPD cache and mapping data */
- {
- for (i = pc->num_types, map = pc->types; i > 0; i --, map ++)
- {
-- _cupsStrFree(map->pwg);
-- _cupsStrFree(map->ppd);
-+ free(map->pwg);
-+ free(map->ppd);
- }
-
- free(pc->types);
- }
-
-- if (pc->custom_max_keyword)
-- _cupsStrFree(pc->custom_max_keyword);
--
-- if (pc->custom_min_keyword)
-- _cupsStrFree(pc->custom_min_keyword);
-+ free(pc->custom_max_keyword);
-+ free(pc->custom_min_keyword);
-
-- _cupsStrFree(pc->product);
-+ free(pc->product);
- cupsArrayDelete(pc->filters);
- cupsArrayDelete(pc->prefilters);
- cupsArrayDelete(pc->finishings);
-
-- _cupsStrFree(pc->charge_info_uri);
-- _cupsStrFree(pc->password);
-+ free(pc->charge_info_uri);
-+ free(pc->password);
-
- cupsArrayDelete(pc->mandatory);
-
-diff --git a/cups/ppd-mark.c b/cups/ppd-mark.c
-index 464c09a98..2d106ba9e 100644
---- a/cups/ppd-mark.c
-+++ b/cups/ppd-mark.c
-@@ -1,8 +1,8 @@
- /*
- * Option marking routines for CUPS.
- *
-- * Copyright 2007-2017 by Apple Inc.
-- * Copyright 1997-2007 by Easy Software Products, all rights reserved.
-+ * Copyright © 2007-2019 by Apple Inc.
-+ * Copyright © 1997-2007 by Easy Software Products, all rights reserved.
- *
- * These coded instructions, statements, and computer programs are the
- * property of Apple Inc. and are protected by Federal copyright
-@@ -890,9 +890,9 @@ ppd_mark_option(ppd_file_t *ppd, /* I - PPD file */
- case PPD_CUSTOM_PASSWORD :
- case PPD_CUSTOM_STRING :
- if (cparam->current.custom_string)
-- _cupsStrFree(cparam->current.custom_string);
-+ free(cparam->current.custom_string);
-
-- cparam->current.custom_string = _cupsStrAlloc(choice + 7);
-+ cparam->current.custom_string = strdup(choice + 7);
- break;
- }
- }
-@@ -967,9 +967,9 @@ ppd_mark_option(ppd_file_t *ppd, /* I - PPD file */
- case PPD_CUSTOM_PASSWORD :
- case PPD_CUSTOM_STRING :
- if (cparam->current.custom_string)
-- _cupsStrFree(cparam->current.custom_string);
-+ free(cparam->current.custom_string);
-
-- cparam->current.custom_string = _cupsStrRetain(val->value);
-+ cparam->current.custom_string = strdup(val->value);
- break;
- }
- }
-diff --git a/cups/ppd.c b/cups/ppd.c
-index 968ea8bf3..435b992f4 100644
---- a/cups/ppd.c
-+++ b/cups/ppd.c
-@@ -34,8 +34,6 @@
- * Definitions...
- */
-
--#define ppd_free(p) if (p) free(p) /* Safe free macro */
--
- #define PPD_KEYWORD 1 /* Line contained a keyword */
- #define PPD_OPTION 2 /* Line contained an option name */
- #define PPD_TEXT 4 /* Line contained human-readable text */
-@@ -135,13 +133,12 @@ ppdClose(ppd_file_t *ppd) /* I - PPD file record */
- * Free all strings at the top level...
- */
-
-- _cupsStrFree(ppd->lang_encoding);
-- _cupsStrFree(ppd->nickname);
-- if (ppd->patches)
-- free(ppd->patches);
-- _cupsStrFree(ppd->jcl_begin);
-- _cupsStrFree(ppd->jcl_end);
-- _cupsStrFree(ppd->jcl_ps);
-+ free(ppd->lang_encoding);
-+ free(ppd->nickname);
-+ free(ppd->patches);
-+ free(ppd->jcl_begin);
-+ free(ppd->jcl_end);
-+ free(ppd->jcl_ps);
-
- /*
- * Free any UI groups, subgroups, and options...
-@@ -152,7 +149,7 @@ ppdClose(ppd_file_t *ppd) /* I - PPD file record */
- for (i = ppd->num_groups, group = ppd->groups; i > 0; i --, group ++)
- ppd_free_group(group);
-
-- ppd_free(ppd->groups);
-+ free(ppd->groups);
- }
-
- cupsArrayDelete(ppd->options);
-@@ -163,14 +160,14 @@ ppdClose(ppd_file_t *ppd) /* I - PPD file record */
- */
-
- if (ppd->num_sizes > 0)
-- ppd_free(ppd->sizes);
-+ free(ppd->sizes);
-
- /*
- * Free any constraints...
- */
-
- if (ppd->num_consts > 0)
-- ppd_free(ppd->consts);
-+ free(ppd->consts);
-
- /*
- * Free any filters...
-@@ -185,9 +182,9 @@ ppdClose(ppd_file_t *ppd) /* I - PPD file record */
- if (ppd->num_fonts > 0)
- {
- for (i = ppd->num_fonts, font = ppd->fonts; i > 0; i --, font ++)
-- _cupsStrFree(*font);
-+ free(*font);
-
-- ppd_free(ppd->fonts);
-+ free(ppd->fonts);
- }
-
- /*
-@@ -195,7 +192,7 @@ ppdClose(ppd_file_t *ppd) /* I - PPD file record */
- */
-
- if (ppd->num_profiles > 0)
-- ppd_free(ppd->profiles);
-+ free(ppd->profiles);
-
- /*
- * Free any attributes...
-@@ -205,11 +202,11 @@ ppdClose(ppd_file_t *ppd) /* I - PPD file record */
- {
- for (i = ppd->num_attrs, attr = ppd->attrs; i > 0; i --, attr ++)
- {
-- _cupsStrFree((*attr)->value);
-- ppd_free(*attr);
-+ free((*attr)->value);
-+ free(*attr);
- }
-
-- ppd_free(ppd->attrs);
-+ free(ppd->attrs);
- }
-
- cupsArrayDelete(ppd->sorted_attrs);
-@@ -231,7 +228,7 @@ ppdClose(ppd_file_t *ppd) /* I - PPD file record */
- case PPD_CUSTOM_PASSCODE :
- case PPD_CUSTOM_PASSWORD :
- case PPD_CUSTOM_STRING :
-- _cupsStrFree(cparam->current.custom_string);
-+ free(cparam->current.custom_string);
- break;
-
- default :
-@@ -279,7 +276,7 @@ ppdClose(ppd_file_t *ppd) /* I - PPD file record */
- * Free the whole record...
- */
-
-- ppd_free(ppd);
-+ free(ppd);
- }
-
-
-@@ -617,15 +614,15 @@ _ppdOpen(
- if (pg->ppd_status == PPD_OK)
- pg->ppd_status = PPD_MISSING_PPDADOBE4;
-
-- _cupsStrFree(string);
-- ppd_free(line.buffer);
-+ free(string);
-+ free(line.buffer);
-
- return (NULL);
- }
-
- DEBUG_printf(("2_ppdOpen: keyword=%s, string=%p", keyword, string));
-
-- _cupsStrFree(string);
-+ free(string);
-
- /*
- * Allocate memory for the PPD file record...
-@@ -635,8 +632,8 @@ _ppdOpen(
- {
- pg->ppd_status = PPD_ALLOC_ERROR;
-
-- _cupsStrFree(string);
-- ppd_free(line.buffer);
-+ free(string);
-+ free(line.buffer);
-
- return (NULL);
- }
-@@ -833,7 +830,7 @@ _ppdOpen(
- * Say all PPD files are UTF-8, since we convert to UTF-8...
- */
-
-- ppd->lang_encoding = _cupsStrAlloc("UTF-8");
-+ ppd->lang_encoding = strdup("UTF-8");
- encoding = _ppdGetEncoding(string);
- }
- else if (!strcmp(keyword, "LanguageVersion"))
-@@ -854,10 +851,10 @@ _ppdOpen(
-
-
- cupsCharsetToUTF8(utf8, string, sizeof(utf8), encoding);
-- ppd->nickname = _cupsStrAlloc((char *)utf8);
-+ ppd->nickname = strdup((char *)utf8);
- }
- else
-- ppd->nickname = _cupsStrAlloc(string);
-+ ppd->nickname = strdup(string);
- }
- else if (!strcmp(keyword, "Product"))
- ppd->product = string;
-@@ -867,17 +864,17 @@ _ppdOpen(
- ppd->ttrasterizer = string;
- else if (!strcmp(keyword, "JCLBegin"))
- {
-- ppd->jcl_begin = _cupsStrAlloc(string);
-+ ppd->jcl_begin = strdup(string);
- ppd_decode(ppd->jcl_begin); /* Decode quoted string */
- }
- else if (!strcmp(keyword, "JCLEnd"))
- {
-- ppd->jcl_end = _cupsStrAlloc(string);
-+ ppd->jcl_end = strdup(string);
- ppd_decode(ppd->jcl_end); /* Decode quoted string */
- }
- else if (!strcmp(keyword, "JCLToPSInterpreter"))
- {
-- ppd->jcl_ps = _cupsStrAlloc(string);
-+ ppd->jcl_ps = strdup(string);
- ppd_decode(ppd->jcl_ps); /* Decode quoted string */
- }
- else if (!strcmp(keyword, "AccurateScreensSupport"))
-@@ -945,10 +942,10 @@ _ppdOpen(
- ppd->num_filters ++;
-
- /*
-- * Retain a copy of the filter string...
-+ * Make a copy of the filter string...
- */
-
-- *filter = _cupsStrRetain(string);
-+ *filter = strdup(string);
- }
- else if (!strcmp(keyword, "Throughput"))
- ppd->throughput = atoi(string);
-@@ -971,7 +968,7 @@ _ppdOpen(
- }
-
- ppd->fonts = tempfonts;
-- ppd->fonts[ppd->num_fonts] = _cupsStrAlloc(name);
-+ ppd->fonts[ppd->num_fonts] = strdup(name);
- ppd->num_fonts ++;
- }
- else if (!strncmp(keyword, "ParamCustom", 11))
-@@ -1136,7 +1133,7 @@ _ppdOpen(
- strlcpy(choice->text, text[0] ? text : _("Custom"),
- sizeof(choice->text));
-
-- choice->code = _cupsStrAlloc(string);
-+ choice->code = strdup(string);
-
- if (custom_option->section == PPD_ORDER_JCL)
- ppd_decode(choice->code);
-@@ -1338,7 +1335,7 @@ _ppdOpen(
-
- option->section = PPD_ORDER_ANY;
-
-- _cupsStrFree(string);
-+ free(string);
- string = NULL;
-
- /*
-@@ -1366,7 +1363,7 @@ _ppdOpen(
- strlcpy(choice->text,
- custom_attr->text[0] ? custom_attr->text : _("Custom"),
- sizeof(choice->text));
-- choice->code = _cupsStrRetain(custom_attr->value);
-+ choice->code = strdup(custom_attr->value);
- }
- }
- else if (!strcmp(keyword, "JCLOpenUI"))
-@@ -1445,7 +1442,7 @@ _ppdOpen(
- option->section = PPD_ORDER_JCL;
- group = NULL;
-
-- _cupsStrFree(string);
-+ free(string);
- string = NULL;
-
- /*
-@@ -1469,7 +1466,7 @@ _ppdOpen(
- strlcpy(choice->text,
- custom_attr->text[0] ? custom_attr->text : _("Custom"),
- sizeof(choice->text));
-- choice->code = _cupsStrRetain(custom_attr->value);
-+ choice->code = strdup(custom_attr->value);
- }
- }
- else if (!strcmp(keyword, "CloseUI"))
-@@ -1483,7 +1480,7 @@ _ppdOpen(
-
- option = NULL;
-
-- _cupsStrFree(string);
-+ free(string);
- string = NULL;
- }
- else if (!strcmp(keyword, "JCLCloseUI"))
-@@ -1497,7 +1494,7 @@ _ppdOpen(
-
- option = NULL;
-
-- _cupsStrFree(string);
-+ free(string);
- string = NULL;
- }
- else if (!strcmp(keyword, "OpenGroup"))
-@@ -1544,14 +1541,14 @@ _ppdOpen(
- if (group == NULL)
- goto error;
-
-- _cupsStrFree(string);
-+ free(string);
- string = NULL;
- }
- else if (!strcmp(keyword, "CloseGroup"))
- {
- group = NULL;
-
-- _cupsStrFree(string);
-+ free(string);
- string = NULL;
- }
- else if (!strcmp(keyword, "OrderDependency"))
-@@ -1609,7 +1606,7 @@ _ppdOpen(
- option->order = order;
- }
-
-- _cupsStrFree(string);
-+ free(string);
- string = NULL;
- }
- else if (!strncmp(keyword, "Default", 7))
-@@ -1852,7 +1849,7 @@ _ppdOpen(
- * Don't add this one as an attribute...
- */
-
-- _cupsStrFree(string);
-+ free(string);
- string = NULL;
- }
- else if (!strcmp(keyword, "PaperDimension"))
-@@ -1874,7 +1871,7 @@ _ppdOpen(
- size->width = (float)_cupsStrScand(string, &sptr, loc);
- size->length = (float)_cupsStrScand(sptr, NULL, loc);
-
-- _cupsStrFree(string);
-+ free(string);
- string = NULL;
- }
- else if (!strcmp(keyword, "ImageableArea"))
-@@ -1898,7 +1895,7 @@ _ppdOpen(
- size->right = (float)_cupsStrScand(sptr, &sptr, loc);
- size->top = (float)_cupsStrScand(sptr, NULL, loc);
-
-- _cupsStrFree(string);
-+ free(string);
- string = NULL;
- }
- else if (option != NULL &&
-@@ -1954,7 +1951,7 @@ _ppdOpen(
- (mask & (PPD_KEYWORD | PPD_STRING)) == (PPD_KEYWORD | PPD_STRING))
- ppd_add_attr(ppd, keyword, name, text, string);
- else
-- _cupsStrFree(string);
-+ free(string);
- }
-
- /*
-@@ -1977,7 +1974,7 @@ _ppdOpen(
- goto error;
- }
-
-- ppd_free(line.buffer);
-+ free(line.buffer);
-
- /*
- * Reset language preferences...
-@@ -2059,8 +2056,8 @@ _ppdOpen(
-
- error:
-
-- _cupsStrFree(string);
-- ppd_free(line.buffer);
-+ free(string);
-+ free(line.buffer);
-
- ppdClose(ppd);
-
-@@ -2498,9 +2495,9 @@ ppd_free_filters(ppd_file_t *ppd) /* I - PPD file */
- if (ppd->num_filters > 0)
- {
- for (i = ppd->num_filters, filter = ppd->filters; i > 0; i --, filter ++)
-- _cupsStrFree(*filter);
-+ free(*filter);
-
-- ppd_free(ppd->filters);
-+ free(ppd->filters);
-
- ppd->num_filters = 0;
- ppd->filters = NULL;
-@@ -2527,7 +2524,7 @@ ppd_free_group(ppd_group_t *group) /* I - Group to free */
- i --, option ++)
- ppd_free_option(option);
-
-- ppd_free(group->options);
-+ free(group->options);
- }
-
- if (group->num_subgroups > 0)
-@@ -2537,7 +2534,7 @@ ppd_free_group(ppd_group_t *group) /* I - Group to free */
- i --, subgroup ++)
- ppd_free_group(subgroup);
-
-- ppd_free(group->subgroups);
-+ free(group->subgroups);
- }
- }
-
-@@ -2559,10 +2556,10 @@ ppd_free_option(ppd_option_t *option) /* I - Option to free */
- i > 0;
- i --, choice ++)
- {
-- _cupsStrFree(choice->code);
-+ free(choice->code);
- }
-
-- ppd_free(option->choices);
-+ free(option->choices);
- }
- }
-
-@@ -3299,7 +3296,7 @@ ppd_read(cups_file_t *fp, /* I - File to read from */
- lineptr ++;
- }
-
-- *string = _cupsStrAlloc(lineptr);
-+ *string = strdup(lineptr);
-
- mask |= PPD_STRING;
- }
-@@ -3421,7 +3418,7 @@ ppd_update_filters(ppd_file_t *ppd, /* I - PPD file */
- filter += ppd->num_filters;
- ppd->num_filters ++;
-
-- *filter = _cupsStrAlloc(buffer);
-+ *filter = strdup(buffer);
- }
- while ((attr = ppdFindNextAttr(ppd, "cupsFilter2", NULL)) != NULL);
-
-diff --git a/cups/string.c b/cups/string.c
-index 0d4ed0f50..dd9c12ce8 100644
---- a/cups/string.c
-+++ b/cups/string.c
-@@ -1,8 +1,8 @@
- /*
- * String functions for CUPS.
- *
-- * Copyright 2007-2014 by Apple Inc.
-- * Copyright 1997-2007 by Easy Software Products.
-+ * Copyright © 2007-2019 by Apple Inc.
-+ * Copyright © 1997-2007 by Easy Software Products.
- *
- * These coded instructions, statements, and computer programs are the
- * property of Apple Inc. and are protected by Federal copyright
-@@ -316,15 +316,6 @@ _cupsStrFree(const char *s) /* I - String to free */
-
- key = (_cups_sp_item_t *)(s - offsetof(_cups_sp_item_t, str));
-
--#ifdef DEBUG_GUARDS
-- if (key->guard != _CUPS_STR_GUARD)
-- {
-- DEBUG_printf(("5_cupsStrFree: Freeing string %p(%s), guard=%08x, "
-- "ref_count=%d", key, key->str, key->guard, key->ref_count));
-- abort();
-- }
--#endif /* DEBUG_GUARDS */
--
- if ((item = (_cups_sp_item_t *)cupsArrayFind(stringpool, key)) != NULL &&
- item == key)
- {
-@@ -332,6 +323,14 @@ _cupsStrFree(const char *s) /* I - String to free */
- * Found it, dereference...
- */
-
-+#ifdef DEBUG_GUARDS
-+ if (key->guard != _CUPS_STR_GUARD)
-+ {
-+ DEBUG_printf(("5_cupsStrFree: Freeing string %p(%s), guard=%08x, ref_count=%d", key, key->str, key->guard, key->ref_count));
-+ abort();
-+ }
-+#endif /* DEBUG_GUARDS */
-+
- item->ref_count --;
-
- if (!item->ref_count)
-diff --git a/scheduler/ipp.c b/scheduler/ipp.c
-index e00275b09..9be8a7f3b 100644
---- a/scheduler/ipp.c
-+++ b/scheduler/ipp.c
-@@ -2601,8 +2601,7 @@ add_printer(cupsd_client_t *con, /* I - Client connection */
- if (!strcmp(attr->values[i].string.text, "none"))
- continue;
-
-- printer->reasons[printer->num_reasons] =
-- _cupsStrRetain(attr->values[i].string.text);
-+ printer->reasons[printer->num_reasons] = _cupsStrAlloc(attr->values[i].string.text);
- printer->num_reasons ++;
-
- if (!strcmp(attr->values[i].string.text, "paused") &&
-@@ -4892,8 +4891,9 @@ copy_printer_attrs(
-
- if ((p2_uri = ippFindAttribute(p2->attrs, "printer-uri-supported",
- IPP_TAG_URI)) != NULL)
-- member_uris->values[i].string.text =
-- _cupsStrRetain(p2_uri->values[0].string.text);
-+ {
-+ member_uris->values[i].string.text = _cupsStrAlloc(p2_uri->values[0].string.text);
-+ }
- else
- {
- httpAssembleURIf(HTTP_URI_CODING_ALL, printer_uri,
diff -Nru cups-2.2.10/debian/patches/0043-Stop-parsing-the-Emulators-keywords-in-PPD-files-Iss.patch cups-2.2.10/debian/patches/0043-Stop-parsing-the-Emulators-keywords-in-PPD-files-Iss.patch
--- cups-2.2.10/debian/patches/0043-Stop-parsing-the-Emulators-keywords-in-PPD-files-Iss.patch 1970-01-01 01:00:00.000000000 +0100
+++ cups-2.2.10/debian/patches/0043-Stop-parsing-the-Emulators-keywords-in-PPD-files-Iss.patch 2019-03-27 17:13:07.000000000 +0100
@@ -0,0 +1,159 @@
+From fb2f9b86fabc11f9b0fad804199064bdd555201e Mon Sep 17 00:00:00 2001
+From: Michael R Sweet <michael.r.sweet@gmail.com>
+Date: Mon, 21 Jan 2019 13:44:43 -0500
+Subject: Stop parsing the Emulators keywords in PPD files (Issue #5475)
+
+This also addresses a potential memory leak...
+---
+ cups/ppd.c | 76 ++----------------------------------------------------
+ cups/ppd.h | 8 +++---
+ 2 files changed, 6 insertions(+), 78 deletions(-)
+
+diff --git a/cups/ppd.c b/cups/ppd.c
+index 5f27484aa..968ea8bf3 100644
+--- a/cups/ppd.c
++++ b/cups/ppd.c
+@@ -1,8 +1,8 @@
+ /*
+ * PPD file routines for CUPS.
+ *
+- * Copyright 2007-2018 by Apple Inc.
+- * Copyright 1997-2007 by Easy Software Products, all rights reserved.
++ * Copyright © 2007-2019 by Apple Inc.
++ * Copyright © 1997-2007 by Easy Software Products, all rights reserved.
+ *
+ * These coded instructions, statements, and computer programs are the
+ * property of Apple Inc. and are protected by Federal copyright
+@@ -117,7 +117,6 @@ void
+ ppdClose(ppd_file_t *ppd) /* I - PPD file record */
+ {
+ int i; /* Looping var */
+- ppd_emul_t *emul; /* Current emulation */
+ ppd_group_t *group; /* Current group */
+ char **font; /* Current font */
+ ppd_attr_t **attr; /* Current attribute */
+@@ -144,21 +143,6 @@ ppdClose(ppd_file_t *ppd) /* I - PPD file record */
+ _cupsStrFree(ppd->jcl_end);
+ _cupsStrFree(ppd->jcl_ps);
+
+- /*
+- * Free any emulations...
+- */
+-
+- if (ppd->num_emulations > 0)
+- {
+- for (i = ppd->num_emulations, emul = ppd->emulations; i > 0; i --, emul ++)
+- {
+- _cupsStrFree(emul->start);
+- _cupsStrFree(emul->stop);
+- }
+-
+- ppd_free(ppd->emulations);
+- }
+-
+ /*
+ * Free any UI groups, subgroups, and options...
+ */
+@@ -443,7 +427,6 @@ _ppdOpen(
+ _ppd_localization_t localization) /* I - Localization to load */
+ {
+ int i, j, k; /* Looping vars */
+- int count; /* Temporary count */
+ _ppd_line_t line; /* Line buffer */
+ ppd_file_t *ppd; /* PPD file record */
+ ppd_group_t *group, /* Current group */
+@@ -461,7 +444,6 @@ _ppdOpen(
+ /* Human-readable text from file */
+ *string, /* Code/text from file */
+ *sptr, /* Pointer into string */
+- *nameptr, /* Pointer into name */
+ *temp, /* Temporary string pointer */
+ **tempfonts; /* Temporary fonts pointer */
+ float order; /* Order dependency number */
+@@ -1203,60 +1185,6 @@ _ppdOpen(
+ else if (!strcmp(string, "Plus90"))
+ ppd->landscape = 90;
+ }
+- else if (!strcmp(keyword, "Emulators") && string)
+- {
+- for (count = 1, sptr = string; sptr != NULL;)
+- if ((sptr = strchr(sptr, ' ')) != NULL)
+- {
+- count ++;
+- while (*sptr == ' ')
+- sptr ++;
+- }
+-
+- ppd->num_emulations = count;
+- if ((ppd->emulations = calloc((size_t)count, sizeof(ppd_emul_t))) == NULL)
+- {
+- pg->ppd_status = PPD_ALLOC_ERROR;
+-
+- goto error;
+- }
+-
+- for (i = 0, sptr = string; i < count; i ++)
+- {
+- for (nameptr = ppd->emulations[i].name;
+- *sptr != '\0' && *sptr != ' ';
+- sptr ++)
+- if (nameptr < (ppd->emulations[i].name + sizeof(ppd->emulations[i].name) - 1))
+- *nameptr++ = *sptr;
+-
+- *nameptr = '\0';
+-
+- while (*sptr == ' ')
+- sptr ++;
+- }
+- }
+- else if (!strncmp(keyword, "StartEmulator_", 14))
+- {
+- ppd_decode(string);
+-
+- for (i = 0; i < ppd->num_emulations; i ++)
+- if (!strcmp(keyword + 14, ppd->emulations[i].name))
+- {
+- ppd->emulations[i].start = string;
+- string = NULL;
+- }
+- }
+- else if (!strncmp(keyword, "StopEmulator_", 13))
+- {
+- ppd_decode(string);
+-
+- for (i = 0; i < ppd->num_emulations; i ++)
+- if (!strcmp(keyword + 13, ppd->emulations[i].name))
+- {
+- ppd->emulations[i].stop = string;
+- string = NULL;
+- }
+- }
+ else if (!strcmp(keyword, "JobPatchFile"))
+ {
+ /*
+diff --git a/cups/ppd.h b/cups/ppd.h
+index 6e628cb60..ae63c0d66 100644
+--- a/cups/ppd.h
++++ b/cups/ppd.h
+@@ -5,8 +5,8 @@
+ * -D_PPD_DEPRECATED="" TO YOUR COMPILE OPTIONS. THIS HEADER AND THESE
+ * FUNCTIONS WILL BE REMOVED IN A FUTURE RELEASE OF CUPS.
+ *
+- * Copyright 2007-2015 by Apple Inc.
+- * Copyright 1997-2007 by Easy Software Products, all rights reserved.
++ * Copyright © 2007-2019 by Apple Inc.
++ * Copyright © 1997-2007 by Easy Software Products, all rights reserved.
+ *
+ * These coded instructions, statements, and computer programs are the
+ * property of Apple Inc. and are protected by Federal copyright
+@@ -304,8 +304,8 @@ typedef struct ppd_file_s /**** PPD File ****/
+ int throughput; /* Pages per minute */
+ ppd_cs_t colorspace; /* Default colorspace */
+ char *patches; /* Patch commands to be sent to printer */
+- int num_emulations; /* Number of emulations supported */
+- ppd_emul_t *emulations; /* Emulations and the code to invoke them */
++ int num_emulations; /* Number of emulations supported (no longer supported) @private@ */
++ ppd_emul_t *emulations; /* Emulations and the code to invoke them (no longer supported) @private@ */
+ char *jcl_begin; /* Start JCL commands */
+ char *jcl_ps; /* Enter PostScript interpreter */
+ char *jcl_end; /* End JCL commands */
diff -Nru cups-2.2.10/debian/patches/0044-Fix-potential-unaligned-accesses-in-the-string-pool-.patch cups-2.2.10/debian/patches/0044-Fix-potential-unaligned-accesses-in-the-string-pool-.patch
--- cups-2.2.10/debian/patches/0044-Fix-potential-unaligned-accesses-in-the-string-pool-.patch 1970-01-01 01:00:00.000000000 +0100
+++ cups-2.2.10/debian/patches/0044-Fix-potential-unaligned-accesses-in-the-string-pool-.patch 2019-03-27 17:13:07.000000000 +0100
@@ -0,0 +1,1130 @@
+From ffbb46708544f6408bc72f200aa7365ba1222f97 Mon Sep 17 00:00:00 2001
+From: Michael R Sweet <michael.r.sweet@gmail.com>
+Date: Mon, 21 Jan 2019 14:21:57 -0500
+Subject: Fix potential unaligned accesses in the string pool (Issue #5474)
+
+This set of changes makes the PPD functions use strdup and free - they were
+modifying the contents of the string in places and doing other things that
+were not safe for (immutable) strings in the pool.
+
+Clean out some more _cupsStr cruft that might potentially cause an unaligned memory access (Issue #5474)
+
+Don't directly use the string pool in the CGI programs or scheduler.
+---
+ cgi-bin/admin.c | 12 ++---
+ cgi-bin/var.c | 42 +++++++--------
+ cups/ppd-cache.c | 134 +++++++++++++++++++++--------------------------
+ cups/ppd-mark.c | 12 ++---
+ cups/ppd.c | 115 ++++++++++++++++++++--------------------
+ cups/string.c | 21 ++++----
+ scheduler/ipp.c | 8 +--
+ 7 files changed, 161 insertions(+), 183 deletions(-)
+
+diff --git a/cgi-bin/admin.c b/cgi-bin/admin.c
+index 690fbbc73..06199a96b 100644
+--- a/cgi-bin/admin.c
++++ b/cgi-bin/admin.c
+@@ -767,7 +767,7 @@ do_am_class(http_t *http, /* I - HTTP connection */
+ attr = ippAddStrings(request, IPP_TAG_PRINTER, IPP_TAG_URI, "member-uris",
+ num_printers, NULL, NULL);
+ for (i = 0; i < num_printers; i ++)
+- attr->values[i].string.text = _cupsStrAlloc(cgiGetArray("MEMBER_URIS", i));
++ ippSetString(request, &attr, i, cgiGetArray("MEMBER_URIS", i));
+ }
+
+ /*
+@@ -2417,7 +2417,7 @@ do_list_printers(http_t *http) /* I - HTTP connection */
+ attr;
+ attr = ippFindNextAttribute(response, "device-uri", IPP_TAG_URI))
+ {
+- cupsArrayAdd(printer_devices, _cupsStrAlloc(attr->values[0].string.text));
++ cupsArrayAdd(printer_devices, strdup(attr->values[0].string.text));
+ }
+
+ /*
+@@ -2555,7 +2555,7 @@ do_list_printers(http_t *http) /* I - HTTP connection */
+ for (printer_device = (char *)cupsArrayFirst(printer_devices);
+ printer_device;
+ printer_device = (char *)cupsArrayNext(printer_devices))
+- _cupsStrFree(printer_device);
++ free(printer_device);
+
+ cupsArrayDelete(printer_devices);
+ }
+@@ -2952,7 +2952,7 @@ do_set_allowed_users(http_t *http) /* I - HTTP connection */
+ * Add the name...
+ */
+
+- attr->values[i].string.text = _cupsStrAlloc(ptr);
++ ippSetString(request, &attr, i, ptr);
+
+ /*
+ * Advance to the next name...
+@@ -3761,8 +3761,8 @@ do_set_options(http_t *http, /* I - HTTP connection */
+
+ attr = ippAddStrings(request, IPP_TAG_PRINTER, IPP_TAG_NAME,
+ "job-sheets-default", 2, NULL, NULL);
+- attr->values[0].string.text = _cupsStrAlloc(cgiGetVariable("job_sheets_start"));
+- attr->values[1].string.text = _cupsStrAlloc(cgiGetVariable("job_sheets_end"));
++ ippSetString(request, &attr, 0, cgiGetVariable("job_sheets_start"));
++ ippSetString(request, &attr, 1, cgiGetVariable("job_sheets_end"));
+
+ if ((var = cgiGetVariable("printer_error_policy")) != NULL)
+ ippAddString(request, IPP_TAG_PRINTER, IPP_TAG_NAME,
+diff --git a/cgi-bin/var.c b/cgi-bin/var.c
+index 579f23ba3..8b8f26472 100644
+--- a/cgi-bin/var.c
++++ b/cgi-bin/var.c
+@@ -1,8 +1,8 @@
+ /*
+ * CGI form variable and array functions for CUPS.
+ *
+- * Copyright 2007-2015 by Apple Inc.
+- * Copyright 1997-2005 by Easy Software Products.
++ * Copyright © 2007-2019 by Apple Inc.
++ * Copyright © 1997-2005 by Easy Software Products.
+ *
+ * These coded instructions, statements, and computer programs are the
+ * property of Apple Inc. and are protected by Federal copyright
+@@ -33,10 +33,10 @@
+
+ typedef struct /**** Form variable structure ****/
+ {
+- const char *name; /* Name of variable */
++ char *name; /* Name of variable */
+ int nvalues, /* Number of values */
+ avalues; /* Number of values allocated */
+- const char **values; /* Value(s) of variable */
++ char **values; /* Value(s) of variable */
+ } _cgi_var_t;
+
+
+@@ -139,10 +139,10 @@ cgiClearVariables(void)
+
+ for (v = form_vars, i = form_count; i > 0; v ++, i --)
+ {
+- _cupsStrFree(v->name);
++ free(v->name);
+ for (j = 0; j < v->nvalues; j ++)
+ if (v->values[j])
+- _cupsStrFree(v->values[j]);
++ free(v->values[j]);
+ }
+
+ form_count = 0;
+@@ -168,7 +168,7 @@ cgiGetArray(const char *name, /* I - Name of array variable */
+ if (element < 0 || element >= var->nvalues)
+ return (NULL);
+
+- return (_cupsStrRetain(var->values[element]));
++ return (strdup(var->values[element]));
+ }
+
+
+@@ -234,7 +234,7 @@ cgiGetVariable(const char *name) /* I - Name of variable */
+ var->values[var->nvalues - 1]));
+ #endif /* DEBUG */
+
+- return ((var == NULL) ? NULL : _cupsStrRetain(var->values[var->nvalues - 1]));
++ return ((var == NULL) ? NULL : strdup(var->values[var->nvalues - 1]));
+ }
+
+
+@@ -382,10 +382,9 @@ cgiSetArray(const char *name, /* I - Name of variable */
+ {
+ if (element >= var->avalues)
+ {
+- const char **temp; /* Temporary pointer */
++ char **temp; /* Temporary pointer */
+
+- temp = (const char **)realloc((void *)(var->values),
+- sizeof(char *) * (size_t)(element + 16));
++ temp = (char **)realloc((void *)(var->values), sizeof(char *) * (size_t)(element + 16));
+ if (!temp)
+ return;
+
+@@ -401,9 +400,9 @@ cgiSetArray(const char *name, /* I - Name of variable */
+ var->nvalues = element + 1;
+ }
+ else if (var->values[element])
+- _cupsStrFree((char *)var->values[element]);
++ free((char *)var->values[element]);
+
+- var->values[element] = _cupsStrAlloc(value);
++ var->values[element] = strdup(value);
+ }
+ }
+
+@@ -460,10 +459,9 @@ cgiSetSize(const char *name, /* I - Name of variable */
+
+ if (size >= var->avalues)
+ {
+- const char **temp; /* Temporary pointer */
++ char **temp; /* Temporary pointer */
+
+- temp = (const char **)realloc((void *)(var->values),
+- sizeof(char *) * (size_t)(size + 16));
++ temp = (char **)realloc((void *)(var->values), sizeof(char *) * (size_t)(size + 16));
+ if (!temp)
+ return;
+
+@@ -480,7 +478,7 @@ cgiSetSize(const char *name, /* I - Name of variable */
+ {
+ for (i = size; i < var->nvalues; i ++)
+ if (var->values[i])
+- _cupsStrFree((void *)(var->values[i]));
++ free((void *)(var->values[i]));
+ }
+
+ var->nvalues = size;
+@@ -515,9 +513,9 @@ cgiSetVariable(const char *name, /* I - Name of variable */
+ {
+ for (i = 0; i < var->nvalues; i ++)
+ if (var->values[i])
+- _cupsStrFree((char *)var->values[i]);
++ free((char *)var->values[i]);
+
+- var->values[0] = _cupsStrAlloc(value);
++ var->values[0] = strdup(value);
+ var->nvalues = 1;
+ }
+ }
+@@ -563,10 +561,10 @@ cgi_add_variable(const char *name, /* I - Variable name */
+ if ((var->values = calloc((size_t)element + 1, sizeof(char *))) == NULL)
+ return;
+
+- var->name = _cupsStrAlloc(name);
++ var->name = strdup(name);
+ var->nvalues = element + 1;
+ var->avalues = element + 1;
+- var->values[element] = _cupsStrAlloc(value);
++ var->values[element] = strdup(value);
+
+ form_count ++;
+ }
+@@ -598,7 +596,7 @@ cgi_find_variable(const char *name) /* I - Name of variable */
+ if (form_count < 1 || name == NULL)
+ return (NULL);
+
+- key.name = name;
++ key.name = (char *)name;
+
+ return ((_cgi_var_t *)bsearch(&key, form_vars, (size_t)form_count, sizeof(_cgi_var_t),
+ (int (*)(const void *, const void *))cgi_compare_variables));
+diff --git a/cups/ppd-cache.c b/cups/ppd-cache.c
+index ab91f0fd4..8b496e3b2 100644
+--- a/cups/ppd-cache.c
++++ b/cups/ppd-cache.c
+@@ -1,7 +1,7 @@
+ /*
+ * PPD cache implementation for CUPS.
+ *
+- * Copyright © 2010-2018 by Apple Inc.
++ * Copyright © 2010-2019 by Apple Inc.
+ *
+ * These coded instructions, statements, and computer programs are the
+ * property of Apple Inc. and are protected by Federal copyright
+@@ -508,24 +508,20 @@ _ppdCacheCreateWithFile(
+ else if (!_cups_strcasecmp(line, "Filter"))
+ {
+ if (!pc->filters)
+- pc->filters = cupsArrayNew3(NULL, NULL, NULL, 0,
+- (cups_acopy_func_t)_cupsStrAlloc,
+- (cups_afree_func_t)_cupsStrFree);
++ pc->filters = cupsArrayNew3(NULL, NULL, NULL, 0, (cups_acopy_func_t)strdup, (cups_afree_func_t)free);
+
+ cupsArrayAdd(pc->filters, value);
+ }
+ else if (!_cups_strcasecmp(line, "PreFilter"))
+ {
+ if (!pc->prefilters)
+- pc->prefilters = cupsArrayNew3(NULL, NULL, NULL, 0,
+- (cups_acopy_func_t)_cupsStrAlloc,
+- (cups_afree_func_t)_cupsStrFree);
++ pc->prefilters = cupsArrayNew3(NULL, NULL, NULL, 0, (cups_acopy_func_t)strdup, (cups_afree_func_t)free);
+
+ cupsArrayAdd(pc->prefilters, value);
+ }
+ else if (!_cups_strcasecmp(line, "Product"))
+ {
+- pc->product = _cupsStrAlloc(value);
++ pc->product = strdup(value);
+ }
+ else if (!_cups_strcasecmp(line, "SingleFile"))
+ {
+@@ -625,8 +621,8 @@ _ppdCacheCreateWithFile(
+ }
+
+ map = pc->bins + pc->num_bins;
+- map->pwg = _cupsStrAlloc(pwg_keyword);
+- map->ppd = _cupsStrAlloc(ppd_keyword);
++ map->pwg = strdup(pwg_keyword);
++ map->ppd = strdup(ppd_keyword);
+
+ pc->num_bins ++;
+ }
+@@ -680,8 +676,8 @@ _ppdCacheCreateWithFile(
+ goto create_error;
+ }
+
+- size->map.pwg = _cupsStrAlloc(pwg_keyword);
+- size->map.ppd = _cupsStrAlloc(ppd_keyword);
++ size->map.pwg = strdup(pwg_keyword);
++ size->map.ppd = strdup(ppd_keyword);
+
+ pc->num_sizes ++;
+ }
+@@ -709,15 +705,15 @@ _ppdCacheCreateWithFile(
+
+ pwgFormatSizeName(pwg_keyword, sizeof(pwg_keyword), "custom", "max",
+ pc->custom_max_width, pc->custom_max_length, NULL);
+- pc->custom_max_keyword = _cupsStrAlloc(pwg_keyword);
++ pc->custom_max_keyword = strdup(pwg_keyword);
+
+ pwgFormatSizeName(pwg_keyword, sizeof(pwg_keyword), "custom", "min",
+ pc->custom_min_width, pc->custom_min_length, NULL);
+- pc->custom_min_keyword = _cupsStrAlloc(pwg_keyword);
++ pc->custom_min_keyword = strdup(pwg_keyword);
+ }
+ else if (!_cups_strcasecmp(line, "SourceOption"))
+ {
+- pc->source_option = _cupsStrAlloc(value);
++ pc->source_option = strdup(value);
+ }
+ else if (!_cups_strcasecmp(line, "NumSources"))
+ {
+@@ -764,8 +760,8 @@ _ppdCacheCreateWithFile(
+ }
+
+ map = pc->sources + pc->num_sources;
+- map->pwg = _cupsStrAlloc(pwg_keyword);
+- map->ppd = _cupsStrAlloc(ppd_keyword);
++ map->pwg = strdup(pwg_keyword);
++ map->ppd = strdup(ppd_keyword);
+
+ pc->num_sources ++;
+ }
+@@ -813,8 +809,8 @@ _ppdCacheCreateWithFile(
+ }
+
+ map = pc->types + pc->num_types;
+- map->pwg = _cupsStrAlloc(pwg_keyword);
+- map->ppd = _cupsStrAlloc(ppd_keyword);
++ map->pwg = strdup(pwg_keyword);
++ map->ppd = strdup(ppd_keyword);
+
+ pc->num_types ++;
+ }
+@@ -844,13 +840,13 @@ _ppdCacheCreateWithFile(
+ pc->presets[print_color_mode] + print_quality);
+ }
+ else if (!_cups_strcasecmp(line, "SidesOption"))
+- pc->sides_option = _cupsStrAlloc(value);
++ pc->sides_option = strdup(value);
+ else if (!_cups_strcasecmp(line, "Sides1Sided"))
+- pc->sides_1sided = _cupsStrAlloc(value);
++ pc->sides_1sided = strdup(value);
+ else if (!_cups_strcasecmp(line, "Sides2SidedLong"))
+- pc->sides_2sided_long = _cupsStrAlloc(value);
++ pc->sides_2sided_long = strdup(value);
+ else if (!_cups_strcasecmp(line, "Sides2SidedShort"))
+- pc->sides_2sided_short = _cupsStrAlloc(value);
++ pc->sides_2sided_short = strdup(value);
+ else if (!_cups_strcasecmp(line, "Finishings"))
+ {
+ if (!pc->finishings)
+@@ -871,13 +867,13 @@ _ppdCacheCreateWithFile(
+ else if (!_cups_strcasecmp(line, "MaxCopies"))
+ pc->max_copies = atoi(value);
+ else if (!_cups_strcasecmp(line, "ChargeInfoURI"))
+- pc->charge_info_uri = _cupsStrAlloc(value);
++ pc->charge_info_uri = strdup(value);
+ else if (!_cups_strcasecmp(line, "JobAccountId"))
+ pc->account_id = !_cups_strcasecmp(value, "true");
+ else if (!_cups_strcasecmp(line, "JobAccountingUserId"))
+ pc->accounting_user_id = !_cups_strcasecmp(value, "true");
+ else if (!_cups_strcasecmp(line, "JobPassword"))
+- pc->password = _cupsStrAlloc(value);
++ pc->password = strdup(value);
+ else if (!_cups_strcasecmp(line, "Mandatory"))
+ {
+ if (pc->mandatory)
+@@ -888,9 +884,7 @@ _ppdCacheCreateWithFile(
+ else if (!_cups_strcasecmp(line, "SupportFile"))
+ {
+ if (!pc->support_files)
+- pc->support_files = cupsArrayNew3(NULL, NULL, NULL, 0,
+- (cups_acopy_func_t)_cupsStrAlloc,
+- (cups_afree_func_t)_cupsStrFree);
++ pc->support_files = cupsArrayNew3(NULL, NULL, NULL, 0, (cups_acopy_func_t)strdup, (cups_afree_func_t)free);
+
+ cupsArrayAdd(pc->support_files, value);
+ }
+@@ -1130,8 +1124,8 @@ _ppdCacheCreateWithPPD(ppd_file_t *ppd) /* I - PPD file */
+ */
+
+ new_size = old_size;
+- _cupsStrFree(old_size->map.ppd);
+- _cupsStrFree(old_size->map.pwg);
++ free(old_size->map.ppd);
++ free(old_size->map.pwg);
+ }
+ }
+
+@@ -1152,8 +1146,8 @@ _ppdCacheCreateWithPPD(ppd_file_t *ppd) /* I - PPD file */
+ * Save this size...
+ */
+
+- new_size->map.ppd = _cupsStrAlloc(ppd_size->name);
+- new_size->map.pwg = _cupsStrAlloc(pwg_name);
++ new_size->map.ppd = strdup(ppd_size->name);
++ new_size->map.pwg = strdup(pwg_name);
+ new_size->width = new_width;
+ new_size->length = new_length;
+ new_size->left = new_left;
+@@ -1173,14 +1167,14 @@ _ppdCacheCreateWithPPD(ppd_file_t *ppd) /* I - PPD file */
+ pwgFormatSizeName(pwg_keyword, sizeof(pwg_keyword), "custom", "max",
+ PWG_FROM_POINTS(ppd->custom_max[0]),
+ PWG_FROM_POINTS(ppd->custom_max[1]), NULL);
+- pc->custom_max_keyword = _cupsStrAlloc(pwg_keyword);
++ pc->custom_max_keyword = strdup(pwg_keyword);
+ pc->custom_max_width = PWG_FROM_POINTS(ppd->custom_max[0]);
+ pc->custom_max_length = PWG_FROM_POINTS(ppd->custom_max[1]);
+
+ pwgFormatSizeName(pwg_keyword, sizeof(pwg_keyword), "custom", "min",
+ PWG_FROM_POINTS(ppd->custom_min[0]),
+ PWG_FROM_POINTS(ppd->custom_min[1]), NULL);
+- pc->custom_min_keyword = _cupsStrAlloc(pwg_keyword);
++ pc->custom_min_keyword = strdup(pwg_keyword);
+ pc->custom_min_width = PWG_FROM_POINTS(ppd->custom_min[0]);
+ pc->custom_min_length = PWG_FROM_POINTS(ppd->custom_min[1]);
+
+@@ -1199,7 +1193,7 @@ _ppdCacheCreateWithPPD(ppd_file_t *ppd) /* I - PPD file */
+
+ if (input_slot)
+ {
+- pc->source_option = _cupsStrAlloc(input_slot->keyword);
++ pc->source_option = strdup(input_slot->keyword);
+
+ if ((pc->sources = calloc((size_t)input_slot->num_choices, sizeof(pwg_map_t))) == NULL)
+ {
+@@ -1251,8 +1245,8 @@ _ppdCacheCreateWithPPD(ppd_file_t *ppd) /* I - PPD file */
+ "_");
+ }
+
+- map->pwg = _cupsStrAlloc(pwg_name);
+- map->ppd = _cupsStrAlloc(choice->choice);
++ map->pwg = strdup(pwg_name);
++ map->ppd = strdup(choice->choice);
+ }
+ }
+
+@@ -1315,8 +1309,8 @@ _ppdCacheCreateWithPPD(ppd_file_t *ppd) /* I - PPD file */
+ "_");
+ }
+
+- map->pwg = _cupsStrAlloc(pwg_name);
+- map->ppd = _cupsStrAlloc(choice->choice);
++ map->pwg = strdup(pwg_name);
++ map->ppd = strdup(choice->choice);
+ }
+ }
+
+@@ -1342,8 +1336,8 @@ _ppdCacheCreateWithPPD(ppd_file_t *ppd) /* I - PPD file */
+ {
+ pwg_unppdize_name(choice->choice, pwg_keyword, sizeof(pwg_keyword), "_");
+
+- map->pwg = _cupsStrAlloc(pwg_keyword);
+- map->ppd = _cupsStrAlloc(choice->choice);
++ map->pwg = strdup(pwg_keyword);
++ map->ppd = strdup(choice->choice);
+ }
+ }
+
+@@ -1558,7 +1552,7 @@ _ppdCacheCreateWithPPD(ppd_file_t *ppd) /* I - PPD file */
+
+ if (duplex)
+ {
+- pc->sides_option = _cupsStrAlloc(duplex->keyword);
++ pc->sides_option = strdup(duplex->keyword);
+
+ for (i = duplex->num_choices, choice = duplex->choices;
+ i > 0;
+@@ -1566,16 +1560,16 @@ _ppdCacheCreateWithPPD(ppd_file_t *ppd) /* I - PPD file */
+ {
+ if ((!_cups_strcasecmp(choice->choice, "None") ||
+ !_cups_strcasecmp(choice->choice, "False")) && !pc->sides_1sided)
+- pc->sides_1sided = _cupsStrAlloc(choice->choice);
++ pc->sides_1sided = strdup(choice->choice);
+ else if ((!_cups_strcasecmp(choice->choice, "DuplexNoTumble") ||
+ !_cups_strcasecmp(choice->choice, "LongEdge") ||
+ !_cups_strcasecmp(choice->choice, "Top")) && !pc->sides_2sided_long)
+- pc->sides_2sided_long = _cupsStrAlloc(choice->choice);
++ pc->sides_2sided_long = strdup(choice->choice);
+ else if ((!_cups_strcasecmp(choice->choice, "DuplexTumble") ||
+ !_cups_strcasecmp(choice->choice, "ShortEdge") ||
+ !_cups_strcasecmp(choice->choice, "Bottom")) &&
+ !pc->sides_2sided_short)
+- pc->sides_2sided_short = _cupsStrAlloc(choice->choice);
++ pc->sides_2sided_short = strdup(choice->choice);
+ }
+ }
+
+@@ -1583,9 +1577,7 @@ _ppdCacheCreateWithPPD(ppd_file_t *ppd) /* I - PPD file */
+ * Copy filters and pre-filters...
+ */
+
+- pc->filters = cupsArrayNew3(NULL, NULL, NULL, 0,
+- (cups_acopy_func_t)_cupsStrAlloc,
+- (cups_afree_func_t)_cupsStrFree);
++ pc->filters = cupsArrayNew3(NULL, NULL, NULL, 0, (cups_acopy_func_t)strdup, (cups_afree_func_t)free);
+
+ cupsArrayAdd(pc->filters,
+ "application/vnd.cups-raw application/octet-stream 0 -");
+@@ -1642,9 +1634,7 @@ _ppdCacheCreateWithPPD(ppd_file_t *ppd) /* I - PPD file */
+
+ if ((ppd_attr = ppdFindAttr(ppd, "cupsPreFilter", NULL)) != NULL)
+ {
+- pc->prefilters = cupsArrayNew3(NULL, NULL, NULL, 0,
+- (cups_acopy_func_t)_cupsStrAlloc,
+- (cups_afree_func_t)_cupsStrFree);
++ pc->prefilters = cupsArrayNew3(NULL, NULL, NULL, 0, (cups_acopy_func_t)strdup, (cups_afree_func_t)free);
+
+ do
+ {
+@@ -1661,7 +1651,7 @@ _ppdCacheCreateWithPPD(ppd_file_t *ppd) /* I - PPD file */
+ */
+
+ if (ppd->product)
+- pc->product = _cupsStrAlloc(ppd->product);
++ pc->product = strdup(ppd->product);
+
+ /*
+ * Copy finishings mapping data...
+@@ -1818,7 +1808,7 @@ _ppdCacheCreateWithPPD(ppd_file_t *ppd) /* I - PPD file */
+ */
+
+ if ((ppd_attr = ppdFindAttr(ppd, "cupsChargeInfoURI", NULL)) != NULL)
+- pc->charge_info_uri = _cupsStrAlloc(ppd_attr->value);
++ pc->charge_info_uri = strdup(ppd_attr->value);
+
+ if ((ppd_attr = ppdFindAttr(ppd, "cupsJobAccountId", NULL)) != NULL)
+ pc->account_id = !_cups_strcasecmp(ppd_attr->value, "true");
+@@ -1827,7 +1817,7 @@ _ppdCacheCreateWithPPD(ppd_file_t *ppd) /* I - PPD file */
+ pc->accounting_user_id = !_cups_strcasecmp(ppd_attr->value, "true");
+
+ if ((ppd_attr = ppdFindAttr(ppd, "cupsJobPassword", NULL)) != NULL)
+- pc->password = _cupsStrAlloc(ppd_attr->value);
++ pc->password = strdup(ppd_attr->value);
+
+ if ((ppd_attr = ppdFindAttr(ppd, "cupsMandatory", NULL)) != NULL)
+ pc->mandatory = _cupsArrayNewStrings(ppd_attr->value, ' ');
+@@ -1836,9 +1826,7 @@ _ppdCacheCreateWithPPD(ppd_file_t *ppd) /* I - PPD file */
+ * Support files...
+ */
+
+- pc->support_files = cupsArrayNew3(NULL, NULL, NULL, 0,
+- (cups_acopy_func_t)_cupsStrAlloc,
+- (cups_afree_func_t)_cupsStrFree);
++ pc->support_files = cupsArrayNew3(NULL, NULL, NULL, 0, (cups_acopy_func_t)strdup, (cups_afree_func_t)free);
+
+ for (ppd_attr = ppdFindAttr(ppd, "cupsICCProfile", NULL);
+ ppd_attr;
+@@ -1894,8 +1882,8 @@ _ppdCacheDestroy(_ppd_cache_t *pc) /* I - PPD cache and mapping data */
+ {
+ for (i = pc->num_bins, map = pc->bins; i > 0; i --, map ++)
+ {
+- _cupsStrFree(map->pwg);
+- _cupsStrFree(map->ppd);
++ free(map->pwg);
++ free(map->ppd);
+ }
+
+ free(pc->bins);
+@@ -1905,22 +1893,21 @@ _ppdCacheDestroy(_ppd_cache_t *pc) /* I - PPD cache and mapping data */
+ {
+ for (i = pc->num_sizes, size = pc->sizes; i > 0; i --, size ++)
+ {
+- _cupsStrFree(size->map.pwg);
+- _cupsStrFree(size->map.ppd);
++ free(size->map.pwg);
++ free(size->map.ppd);
+ }
+
+ free(pc->sizes);
+ }
+
+- if (pc->source_option)
+- _cupsStrFree(pc->source_option);
++ free(pc->source_option);
+
+ if (pc->sources)
+ {
+ for (i = pc->num_sources, map = pc->sources; i > 0; i --, map ++)
+ {
+- _cupsStrFree(map->pwg);
+- _cupsStrFree(map->ppd);
++ free(map->pwg);
++ free(map->ppd);
+ }
+
+ free(pc->sources);
+@@ -1930,26 +1917,23 @@ _ppdCacheDestroy(_ppd_cache_t *pc) /* I - PPD cache and mapping data */
+ {
+ for (i = pc->num_types, map = pc->types; i > 0; i --, map ++)
+ {
+- _cupsStrFree(map->pwg);
+- _cupsStrFree(map->ppd);
++ free(map->pwg);
++ free(map->ppd);
+ }
+
+ free(pc->types);
+ }
+
+- if (pc->custom_max_keyword)
+- _cupsStrFree(pc->custom_max_keyword);
+-
+- if (pc->custom_min_keyword)
+- _cupsStrFree(pc->custom_min_keyword);
++ free(pc->custom_max_keyword);
++ free(pc->custom_min_keyword);
+
+- _cupsStrFree(pc->product);
++ free(pc->product);
+ cupsArrayDelete(pc->filters);
+ cupsArrayDelete(pc->prefilters);
+ cupsArrayDelete(pc->finishings);
+
+- _cupsStrFree(pc->charge_info_uri);
+- _cupsStrFree(pc->password);
++ free(pc->charge_info_uri);
++ free(pc->password);
+
+ cupsArrayDelete(pc->mandatory);
+
+diff --git a/cups/ppd-mark.c b/cups/ppd-mark.c
+index 464c09a98..2d106ba9e 100644
+--- a/cups/ppd-mark.c
++++ b/cups/ppd-mark.c
+@@ -1,8 +1,8 @@
+ /*
+ * Option marking routines for CUPS.
+ *
+- * Copyright 2007-2017 by Apple Inc.
+- * Copyright 1997-2007 by Easy Software Products, all rights reserved.
++ * Copyright © 2007-2019 by Apple Inc.
++ * Copyright © 1997-2007 by Easy Software Products, all rights reserved.
+ *
+ * These coded instructions, statements, and computer programs are the
+ * property of Apple Inc. and are protected by Federal copyright
+@@ -890,9 +890,9 @@ ppd_mark_option(ppd_file_t *ppd, /* I - PPD file */
+ case PPD_CUSTOM_PASSWORD :
+ case PPD_CUSTOM_STRING :
+ if (cparam->current.custom_string)
+- _cupsStrFree(cparam->current.custom_string);
++ free(cparam->current.custom_string);
+
+- cparam->current.custom_string = _cupsStrAlloc(choice + 7);
++ cparam->current.custom_string = strdup(choice + 7);
+ break;
+ }
+ }
+@@ -967,9 +967,9 @@ ppd_mark_option(ppd_file_t *ppd, /* I - PPD file */
+ case PPD_CUSTOM_PASSWORD :
+ case PPD_CUSTOM_STRING :
+ if (cparam->current.custom_string)
+- _cupsStrFree(cparam->current.custom_string);
++ free(cparam->current.custom_string);
+
+- cparam->current.custom_string = _cupsStrRetain(val->value);
++ cparam->current.custom_string = strdup(val->value);
+ break;
+ }
+ }
+diff --git a/cups/ppd.c b/cups/ppd.c
+index 968ea8bf3..435b992f4 100644
+--- a/cups/ppd.c
++++ b/cups/ppd.c
+@@ -34,8 +34,6 @@
+ * Definitions...
+ */
+
+-#define ppd_free(p) if (p) free(p) /* Safe free macro */
+-
+ #define PPD_KEYWORD 1 /* Line contained a keyword */
+ #define PPD_OPTION 2 /* Line contained an option name */
+ #define PPD_TEXT 4 /* Line contained human-readable text */
+@@ -135,13 +133,12 @@ ppdClose(ppd_file_t *ppd) /* I - PPD file record */
+ * Free all strings at the top level...
+ */
+
+- _cupsStrFree(ppd->lang_encoding);
+- _cupsStrFree(ppd->nickname);
+- if (ppd->patches)
+- free(ppd->patches);
+- _cupsStrFree(ppd->jcl_begin);
+- _cupsStrFree(ppd->jcl_end);
+- _cupsStrFree(ppd->jcl_ps);
++ free(ppd->lang_encoding);
++ free(ppd->nickname);
++ free(ppd->patches);
++ free(ppd->jcl_begin);
++ free(ppd->jcl_end);
++ free(ppd->jcl_ps);
+
+ /*
+ * Free any UI groups, subgroups, and options...
+@@ -152,7 +149,7 @@ ppdClose(ppd_file_t *ppd) /* I - PPD file record */
+ for (i = ppd->num_groups, group = ppd->groups; i > 0; i --, group ++)
+ ppd_free_group(group);
+
+- ppd_free(ppd->groups);
++ free(ppd->groups);
+ }
+
+ cupsArrayDelete(ppd->options);
+@@ -163,14 +160,14 @@ ppdClose(ppd_file_t *ppd) /* I - PPD file record */
+ */
+
+ if (ppd->num_sizes > 0)
+- ppd_free(ppd->sizes);
++ free(ppd->sizes);
+
+ /*
+ * Free any constraints...
+ */
+
+ if (ppd->num_consts > 0)
+- ppd_free(ppd->consts);
++ free(ppd->consts);
+
+ /*
+ * Free any filters...
+@@ -185,9 +182,9 @@ ppdClose(ppd_file_t *ppd) /* I - PPD file record */
+ if (ppd->num_fonts > 0)
+ {
+ for (i = ppd->num_fonts, font = ppd->fonts; i > 0; i --, font ++)
+- _cupsStrFree(*font);
++ free(*font);
+
+- ppd_free(ppd->fonts);
++ free(ppd->fonts);
+ }
+
+ /*
+@@ -195,7 +192,7 @@ ppdClose(ppd_file_t *ppd) /* I - PPD file record */
+ */
+
+ if (ppd->num_profiles > 0)
+- ppd_free(ppd->profiles);
++ free(ppd->profiles);
+
+ /*
+ * Free any attributes...
+@@ -205,11 +202,11 @@ ppdClose(ppd_file_t *ppd) /* I - PPD file record */
+ {
+ for (i = ppd->num_attrs, attr = ppd->attrs; i > 0; i --, attr ++)
+ {
+- _cupsStrFree((*attr)->value);
+- ppd_free(*attr);
++ free((*attr)->value);
++ free(*attr);
+ }
+
+- ppd_free(ppd->attrs);
++ free(ppd->attrs);
+ }
+
+ cupsArrayDelete(ppd->sorted_attrs);
+@@ -231,7 +228,7 @@ ppdClose(ppd_file_t *ppd) /* I - PPD file record */
+ case PPD_CUSTOM_PASSCODE :
+ case PPD_CUSTOM_PASSWORD :
+ case PPD_CUSTOM_STRING :
+- _cupsStrFree(cparam->current.custom_string);
++ free(cparam->current.custom_string);
+ break;
+
+ default :
+@@ -279,7 +276,7 @@ ppdClose(ppd_file_t *ppd) /* I - PPD file record */
+ * Free the whole record...
+ */
+
+- ppd_free(ppd);
++ free(ppd);
+ }
+
+
+@@ -617,15 +614,15 @@ _ppdOpen(
+ if (pg->ppd_status == PPD_OK)
+ pg->ppd_status = PPD_MISSING_PPDADOBE4;
+
+- _cupsStrFree(string);
+- ppd_free(line.buffer);
++ free(string);
++ free(line.buffer);
+
+ return (NULL);
+ }
+
+ DEBUG_printf(("2_ppdOpen: keyword=%s, string=%p", keyword, string));
+
+- _cupsStrFree(string);
++ free(string);
+
+ /*
+ * Allocate memory for the PPD file record...
+@@ -635,8 +632,8 @@ _ppdOpen(
+ {
+ pg->ppd_status = PPD_ALLOC_ERROR;
+
+- _cupsStrFree(string);
+- ppd_free(line.buffer);
++ free(string);
++ free(line.buffer);
+
+ return (NULL);
+ }
+@@ -833,7 +830,7 @@ _ppdOpen(
+ * Say all PPD files are UTF-8, since we convert to UTF-8...
+ */
+
+- ppd->lang_encoding = _cupsStrAlloc("UTF-8");
++ ppd->lang_encoding = strdup("UTF-8");
+ encoding = _ppdGetEncoding(string);
+ }
+ else if (!strcmp(keyword, "LanguageVersion"))
+@@ -854,10 +851,10 @@ _ppdOpen(
+
+
+ cupsCharsetToUTF8(utf8, string, sizeof(utf8), encoding);
+- ppd->nickname = _cupsStrAlloc((char *)utf8);
++ ppd->nickname = strdup((char *)utf8);
+ }
+ else
+- ppd->nickname = _cupsStrAlloc(string);
++ ppd->nickname = strdup(string);
+ }
+ else if (!strcmp(keyword, "Product"))
+ ppd->product = string;
+@@ -867,17 +864,17 @@ _ppdOpen(
+ ppd->ttrasterizer = string;
+ else if (!strcmp(keyword, "JCLBegin"))
+ {
+- ppd->jcl_begin = _cupsStrAlloc(string);
++ ppd->jcl_begin = strdup(string);
+ ppd_decode(ppd->jcl_begin); /* Decode quoted string */
+ }
+ else if (!strcmp(keyword, "JCLEnd"))
+ {
+- ppd->jcl_end = _cupsStrAlloc(string);
++ ppd->jcl_end = strdup(string);
+ ppd_decode(ppd->jcl_end); /* Decode quoted string */
+ }
+ else if (!strcmp(keyword, "JCLToPSInterpreter"))
+ {
+- ppd->jcl_ps = _cupsStrAlloc(string);
++ ppd->jcl_ps = strdup(string);
+ ppd_decode(ppd->jcl_ps); /* Decode quoted string */
+ }
+ else if (!strcmp(keyword, "AccurateScreensSupport"))
+@@ -945,10 +942,10 @@ _ppdOpen(
+ ppd->num_filters ++;
+
+ /*
+- * Retain a copy of the filter string...
++ * Make a copy of the filter string...
+ */
+
+- *filter = _cupsStrRetain(string);
++ *filter = strdup(string);
+ }
+ else if (!strcmp(keyword, "Throughput"))
+ ppd->throughput = atoi(string);
+@@ -971,7 +968,7 @@ _ppdOpen(
+ }
+
+ ppd->fonts = tempfonts;
+- ppd->fonts[ppd->num_fonts] = _cupsStrAlloc(name);
++ ppd->fonts[ppd->num_fonts] = strdup(name);
+ ppd->num_fonts ++;
+ }
+ else if (!strncmp(keyword, "ParamCustom", 11))
+@@ -1136,7 +1133,7 @@ _ppdOpen(
+ strlcpy(choice->text, text[0] ? text : _("Custom"),
+ sizeof(choice->text));
+
+- choice->code = _cupsStrAlloc(string);
++ choice->code = strdup(string);
+
+ if (custom_option->section == PPD_ORDER_JCL)
+ ppd_decode(choice->code);
+@@ -1338,7 +1335,7 @@ _ppdOpen(
+
+ option->section = PPD_ORDER_ANY;
+
+- _cupsStrFree(string);
++ free(string);
+ string = NULL;
+
+ /*
+@@ -1366,7 +1363,7 @@ _ppdOpen(
+ strlcpy(choice->text,
+ custom_attr->text[0] ? custom_attr->text : _("Custom"),
+ sizeof(choice->text));
+- choice->code = _cupsStrRetain(custom_attr->value);
++ choice->code = strdup(custom_attr->value);
+ }
+ }
+ else if (!strcmp(keyword, "JCLOpenUI"))
+@@ -1445,7 +1442,7 @@ _ppdOpen(
+ option->section = PPD_ORDER_JCL;
+ group = NULL;
+
+- _cupsStrFree(string);
++ free(string);
+ string = NULL;
+
+ /*
+@@ -1469,7 +1466,7 @@ _ppdOpen(
+ strlcpy(choice->text,
+ custom_attr->text[0] ? custom_attr->text : _("Custom"),
+ sizeof(choice->text));
+- choice->code = _cupsStrRetain(custom_attr->value);
++ choice->code = strdup(custom_attr->value);
+ }
+ }
+ else if (!strcmp(keyword, "CloseUI"))
+@@ -1483,7 +1480,7 @@ _ppdOpen(
+
+ option = NULL;
+
+- _cupsStrFree(string);
++ free(string);
+ string = NULL;
+ }
+ else if (!strcmp(keyword, "JCLCloseUI"))
+@@ -1497,7 +1494,7 @@ _ppdOpen(
+
+ option = NULL;
+
+- _cupsStrFree(string);
++ free(string);
+ string = NULL;
+ }
+ else if (!strcmp(keyword, "OpenGroup"))
+@@ -1544,14 +1541,14 @@ _ppdOpen(
+ if (group == NULL)
+ goto error;
+
+- _cupsStrFree(string);
++ free(string);
+ string = NULL;
+ }
+ else if (!strcmp(keyword, "CloseGroup"))
+ {
+ group = NULL;
+
+- _cupsStrFree(string);
++ free(string);
+ string = NULL;
+ }
+ else if (!strcmp(keyword, "OrderDependency"))
+@@ -1609,7 +1606,7 @@ _ppdOpen(
+ option->order = order;
+ }
+
+- _cupsStrFree(string);
++ free(string);
+ string = NULL;
+ }
+ else if (!strncmp(keyword, "Default", 7))
+@@ -1852,7 +1849,7 @@ _ppdOpen(
+ * Don't add this one as an attribute...
+ */
+
+- _cupsStrFree(string);
++ free(string);
+ string = NULL;
+ }
+ else if (!strcmp(keyword, "PaperDimension"))
+@@ -1874,7 +1871,7 @@ _ppdOpen(
+ size->width = (float)_cupsStrScand(string, &sptr, loc);
+ size->length = (float)_cupsStrScand(sptr, NULL, loc);
+
+- _cupsStrFree(string);
++ free(string);
+ string = NULL;
+ }
+ else if (!strcmp(keyword, "ImageableArea"))
+@@ -1898,7 +1895,7 @@ _ppdOpen(
+ size->right = (float)_cupsStrScand(sptr, &sptr, loc);
+ size->top = (float)_cupsStrScand(sptr, NULL, loc);
+
+- _cupsStrFree(string);
++ free(string);
+ string = NULL;
+ }
+ else if (option != NULL &&
+@@ -1954,7 +1951,7 @@ _ppdOpen(
+ (mask & (PPD_KEYWORD | PPD_STRING)) == (PPD_KEYWORD | PPD_STRING))
+ ppd_add_attr(ppd, keyword, name, text, string);
+ else
+- _cupsStrFree(string);
++ free(string);
+ }
+
+ /*
+@@ -1977,7 +1974,7 @@ _ppdOpen(
+ goto error;
+ }
+
+- ppd_free(line.buffer);
++ free(line.buffer);
+
+ /*
+ * Reset language preferences...
+@@ -2059,8 +2056,8 @@ _ppdOpen(
+
+ error:
+
+- _cupsStrFree(string);
+- ppd_free(line.buffer);
++ free(string);
++ free(line.buffer);
+
+ ppdClose(ppd);
+
+@@ -2498,9 +2495,9 @@ ppd_free_filters(ppd_file_t *ppd) /* I - PPD file */
+ if (ppd->num_filters > 0)
+ {
+ for (i = ppd->num_filters, filter = ppd->filters; i > 0; i --, filter ++)
+- _cupsStrFree(*filter);
++ free(*filter);
+
+- ppd_free(ppd->filters);
++ free(ppd->filters);
+
+ ppd->num_filters = 0;
+ ppd->filters = NULL;
+@@ -2527,7 +2524,7 @@ ppd_free_group(ppd_group_t *group) /* I - Group to free */
+ i --, option ++)
+ ppd_free_option(option);
+
+- ppd_free(group->options);
++ free(group->options);
+ }
+
+ if (group->num_subgroups > 0)
+@@ -2537,7 +2534,7 @@ ppd_free_group(ppd_group_t *group) /* I - Group to free */
+ i --, subgroup ++)
+ ppd_free_group(subgroup);
+
+- ppd_free(group->subgroups);
++ free(group->subgroups);
+ }
+ }
+
+@@ -2559,10 +2556,10 @@ ppd_free_option(ppd_option_t *option) /* I - Option to free */
+ i > 0;
+ i --, choice ++)
+ {
+- _cupsStrFree(choice->code);
++ free(choice->code);
+ }
+
+- ppd_free(option->choices);
++ free(option->choices);
+ }
+ }
+
+@@ -3299,7 +3296,7 @@ ppd_read(cups_file_t *fp, /* I - File to read from */
+ lineptr ++;
+ }
+
+- *string = _cupsStrAlloc(lineptr);
++ *string = strdup(lineptr);
+
+ mask |= PPD_STRING;
+ }
+@@ -3421,7 +3418,7 @@ ppd_update_filters(ppd_file_t *ppd, /* I - PPD file */
+ filter += ppd->num_filters;
+ ppd->num_filters ++;
+
+- *filter = _cupsStrAlloc(buffer);
++ *filter = strdup(buffer);
+ }
+ while ((attr = ppdFindNextAttr(ppd, "cupsFilter2", NULL)) != NULL);
+
+diff --git a/cups/string.c b/cups/string.c
+index 0d4ed0f50..dd9c12ce8 100644
+--- a/cups/string.c
++++ b/cups/string.c
+@@ -1,8 +1,8 @@
+ /*
+ * String functions for CUPS.
+ *
+- * Copyright 2007-2014 by Apple Inc.
+- * Copyright 1997-2007 by Easy Software Products.
++ * Copyright © 2007-2019 by Apple Inc.
++ * Copyright © 1997-2007 by Easy Software Products.
+ *
+ * These coded instructions, statements, and computer programs are the
+ * property of Apple Inc. and are protected by Federal copyright
+@@ -316,15 +316,6 @@ _cupsStrFree(const char *s) /* I - String to free */
+
+ key = (_cups_sp_item_t *)(s - offsetof(_cups_sp_item_t, str));
+
+-#ifdef DEBUG_GUARDS
+- if (key->guard != _CUPS_STR_GUARD)
+- {
+- DEBUG_printf(("5_cupsStrFree: Freeing string %p(%s), guard=%08x, "
+- "ref_count=%d", key, key->str, key->guard, key->ref_count));
+- abort();
+- }
+-#endif /* DEBUG_GUARDS */
+-
+ if ((item = (_cups_sp_item_t *)cupsArrayFind(stringpool, key)) != NULL &&
+ item == key)
+ {
+@@ -332,6 +323,14 @@ _cupsStrFree(const char *s) /* I - String to free */
+ * Found it, dereference...
+ */
+
++#ifdef DEBUG_GUARDS
++ if (key->guard != _CUPS_STR_GUARD)
++ {
++ DEBUG_printf(("5_cupsStrFree: Freeing string %p(%s), guard=%08x, ref_count=%d", key, key->str, key->guard, key->ref_count));
++ abort();
++ }
++#endif /* DEBUG_GUARDS */
++
+ item->ref_count --;
+
+ if (!item->ref_count)
+diff --git a/scheduler/ipp.c b/scheduler/ipp.c
+index e00275b09..9be8a7f3b 100644
+--- a/scheduler/ipp.c
++++ b/scheduler/ipp.c
+@@ -2601,8 +2601,7 @@ add_printer(cupsd_client_t *con, /* I - Client connection */
+ if (!strcmp(attr->values[i].string.text, "none"))
+ continue;
+
+- printer->reasons[printer->num_reasons] =
+- _cupsStrRetain(attr->values[i].string.text);
++ printer->reasons[printer->num_reasons] = _cupsStrAlloc(attr->values[i].string.text);
+ printer->num_reasons ++;
+
+ if (!strcmp(attr->values[i].string.text, "paused") &&
+@@ -4892,8 +4891,9 @@ copy_printer_attrs(
+
+ if ((p2_uri = ippFindAttribute(p2->attrs, "printer-uri-supported",
+ IPP_TAG_URI)) != NULL)
+- member_uris->values[i].string.text =
+- _cupsStrRetain(p2_uri->values[0].string.text);
++ {
++ member_uris->values[i].string.text = _cupsStrAlloc(p2_uri->values[0].string.text);
++ }
+ else
+ {
+ httpAssembleURIf(HTTP_URI_CODING_ALL, printer_uri,
diff -Nru cups-2.2.10/debian/patches/manpage-translations.patch cups-2.2.10/debian/patches/manpage-translations.patch
--- cups-2.2.10/debian/patches/manpage-translations.patch 2019-02-16 14:48:42.000000000 +0100
+++ cups-2.2.10/debian/patches/manpage-translations.patch 2019-03-27 17:13:07.000000000 +0100
@@ -1,4 +1,4 @@
-From 3a541d1cb57989a954984fb70ba5e45a65eeeaa6 Mon Sep 17 00:00:00 2001
+From 2fb6d0075ed13f2fd03a8600a6ecb0892818116b Mon Sep 17 00:00:00 2001
From: Didier Raboud <odyx@debian.org>
Date: Tue, 9 Aug 2016 18:11:50 +0200
Subject: po4a infrastructure and translations for manpages.
diff -Nru cups-2.2.10/debian/patches/series cups-2.2.10/debian/patches/series
--- cups-2.2.10/debian/patches/series 2019-02-16 14:48:42.000000000 +0100
+++ cups-2.2.10/debian/patches/series 2019-03-27 17:13:07.000000000 +0100
@@ -37,7 +37,9 @@
0037-Use-the-same-requested-attributes-values-for-all-IPP.patch
0038-Add-a-USB-quirk-rule-for-the-Lexmark-E120n-Issue-547.patch
0039-Updated-the-USB-quirks-rule-for-Zebra-label-printers.patch
-0040-Fix-compile-error-on-Linux-Issue-5483.patch
-0041-Stop-parsing-the-Emulators-keywords-in-PPD-files-Iss.patch
-0042-Fix-potential-unaligned-accesses-in-the-string-pool-.patch
+0040-Add-USB-quirks-rule-for-Xerox-printers-Issue-5523.patch
+0041-Add-a-USB-quirks-rule-for-the-DYMO-450-Turbo-Issue-5.patch
+0042-Fix-compile-error-on-Linux-Issue-5483.patch
+0043-Stop-parsing-the-Emulators-keywords-in-PPD-files-Iss.patch
+0044-Fix-potential-unaligned-accesses-in-the-string-pool-.patch
manpage-translations.patch
--- End Message ---