[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Bug#925874: marked as done (unblock: cups/2.2.10-5)



Your message dated Wed, 27 Mar 2019 20:49:00 +0000
with message-id <85467384-370b-a737-9a9c-941f371e45bf@thykier.net>
and subject line Re: Bug#925874: unblock: cups/2.2.10-5
has caused the Debian Bug report #925874,
regarding unblock: cups/2.2.10-5
to be marked as done.

This means that you claim that the problem has been dealt with.
If this is not the case it is now your responsibility to reopen the
Bug report if necessary, and/or fix the problem forthwith.

(NB: If you are a system administrator and have no idea what this
message is talking about, this may indicate a serious mail system
misconfiguration somewhere. Please contact owner@bugs.debian.org
immediately.)


-- 
925874: https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=925874
Debian Bug Tracking System
Contact owner@bugs.debian.org with problems
--- 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 ---
--- Begin Message ---
Didier 'OdyX' Raboud:
> 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):
> 
> [...]
> 
> 
> unblock cups/2.2.10-5
> 
> [...]
Unblocked, thanks.
~Niels

--- End Message ---

Reply to: