CUPS: Update to 2.4.6

Message ID d2cf104f-0d70-418e-9c25-015d023cece2@ipfire.org
State Accepted
Commit 79da0b3159b935461fbc94760929352dbfb52c1a
Headers
Series CUPS: Update to 2.4.6 |

Commit Message

Peter Müller June 25, 2023, 9:05 p.m. UTC
  Several security-relevant bugs have been fixed since version 2.4.2,
please refer to https://github.com/OpenPrinting/cups/releases for the
respective changelogs.

Signed-off-by: Peter Müller <peter.mueller@ipfire.org>
---
 lfs/cups                                      |   8 +-
 ...ificate_generation_bugs_with_openssl.patch | 337 ------------------
 ..._default_cupsd_keychain_with_OpenSSL.patch |  16 -
 3 files changed, 3 insertions(+), 358 deletions(-)
 delete mode 100644 src/patches/cups-2.4.2_Fix_TLS_certificate_generation_bugs_with_openssl.patch
 delete mode 100644 src/patches/cups-2.4.2_Fix_default_cupsd_keychain_with_OpenSSL.patch
  

Patch

diff --git a/lfs/cups b/lfs/cups
index 80b34580b..70839736f 100644
--- a/lfs/cups
+++ b/lfs/cups
@@ -24,7 +24,7 @@ 
 
 include Config
 
-VER        = 2.4.2
+VER        = 2.4.6
 SUMMARY    = The Common UNIX Printing System
 
 THISAPP    = cups-$(VER)
@@ -33,7 +33,7 @@  DL_FROM    = $(URL_IPFIRE)
 DIR_APP    = $(DIR_SRC)/cups-$(VER)
 TARGET     = $(DIR_INFO)/$(THISAPP)
 PROG       = cups
-PAK_VER    = 35
+PAK_VER    = 36
 
 DEPS       = avahi cups-filters dbus ghostscript libexif
 
@@ -47,7 +47,7 @@  objects = $(DL_FILE)
 
 $(DL_FILE) = $(DL_FROM)/$(DL_FILE)
 
-$(DL_FILE)_BLAKE2 = 97053feb502d4fdc28810b806000b6c84a6795d5adcec0789e73e5477d5802d46a99381366d16219f627166df088f6decde5c144bd0c38b5745815dc1e426bc5
+$(DL_FILE)_BLAKE2 = 4e61112ddaa46f20b1cfcb8f523dd07ba7d82604b9857754b288a2a9c5bc50ce242cfa119867347e4696818dc2eb505cf7fff1f9a0634e314edb2500395b83e4
 
 install : $(TARGET)
 
@@ -80,8 +80,6 @@  $(subst %,%_BLAKE2,$(objects)) :
 $(TARGET) : $(patsubst %,$(DIR_DL)/%,$(objects))
 	@$(PREBUILD)
 	@rm -rf $(DIR_APP) && cd $(DIR_SRC) && tar axf $(DIR_DL)/$(DL_FILE)
-	cd $(DIR_APP) && patch -Np1 < $(DIR_SRC)/src/patches/cups-2.4.2_Fix_default_cupsd_keychain_with_OpenSSL.patch
-	cd $(DIR_APP) && patch -Np1 < $(DIR_SRC)/src/patches/cups-2.4.2_Fix_TLS_certificate_generation_bugs_with_openssl.patch
 	$(UPDATE_AUTOMAKE)
 	cd $(DIR_APP) && \
 		./configure \
diff --git a/src/patches/cups-2.4.2_Fix_TLS_certificate_generation_bugs_with_openssl.patch b/src/patches/cups-2.4.2_Fix_TLS_certificate_generation_bugs_with_openssl.patch
deleted file mode 100644
index a356474d2..000000000
--- a/src/patches/cups-2.4.2_Fix_TLS_certificate_generation_bugs_with_openssl.patch
+++ /dev/null
@@ -1,337 +0,0 @@ 
---- cups-2.4.2/cups/tls-openssl.c.orig	2022-05-26 08:17:21.000000000 +0200
-+++ cups-2.4.2/cups/tls-openssl.c	2023-04-24 20:13:16.431108315 +0200
-@@ -1,7 +1,7 @@
- /*
-  * TLS support code for CUPS using OpenSSL/LibreSSL.
-  *
-- * Copyright © 2020-2022 by OpenPrinting
-+ * Copyright © 2020-2023 by OpenPrinting
-  * Copyright © 2007-2019 by Apple Inc.
-  * Copyright © 1997-2007 by Easy Software Products, all rights reserved.
-  *
-@@ -35,7 +35,8 @@
- static time_t		http_get_date(X509 *cert, int which);
- //static void		http_load_crl(void);
- static const char	*http_make_path(char *buffer, size_t bufsize, const char *dirname, const char *filename, const char *ext);
--static void		http_x509_add_san(X509 *cert, const char *name);
-+static int		http_x509_add_ext(X509 *cert, int nid, const char *value);
-+static void		http_x509_add_san(GENERAL_NAMES *gens, const char *name);
- 
- 
- /*
-@@ -79,11 +80,15 @@
-   cups_lang_t	*language;		// Default language info
-   time_t	curtime;		// Current time
-   X509_NAME	*name;			// Subject/issuer name
-+  ASN1_INTEGER	*serial;		// Serial number
-+  ASN1_TIME	*notBefore,		// Initial date
-+		*notAfter;		// Expiration date
-   BIO		*bio;			// Output file
-   char		temp[1024],		// Temporary directory name
-  		crtfile[1024],		// Certificate filename
- 		keyfile[1024];		// Private key filename
-   const char	*common_ptr;		// Pointer into common name
-+  GENERAL_NAMES *gens;			// Names for SubjectAltName certificate extension
- 
- 
-   DEBUG_printf(("cupsMakeServerCredentials(path=\"%s\", common_name=\"%s\", num_alt_names=%d, alt_names=%p, expiration_date=%d)", path, common_name, num_alt_names, alt_names, (int)expiration_date));
-@@ -104,7 +109,7 @@
-   // Create the encryption key...
-   DEBUG_puts("1cupsMakeServerCredentials: Creating key pair.");
- 
--  if ((rsa = RSA_generate_key(2048, RSA_F4, NULL, NULL)) == NULL)
-+  if ((rsa = RSA_generate_key(3072, RSA_F4, NULL, NULL)) == NULL)
-   {
-     _cupsSetError(IPP_STATUS_ERROR_INTERNAL, _("Unable to create key pair."), 1);
-     return (0);
-@@ -131,25 +136,43 @@
-     return (0);
-   }
- 
--  curtime  = time(NULL);
--  language = cupsLangDefault();
-+  curtime = time(NULL);
-+
-+  notBefore = ASN1_TIME_new();
-+  ASN1_TIME_set(notBefore, curtime);
-+  X509_set_notBefore(cert, notBefore);
-+  ASN1_TIME_free(notBefore);
-+
-+  notAfter  = ASN1_TIME_new();
-+  ASN1_TIME_set(notAfter, expiration_date);
-+  X509_set_notAfter(cert, notAfter);
-+  ASN1_TIME_free(notAfter);
-+
-+  serial = ASN1_INTEGER_new();
-+  ASN1_INTEGER_set(serial, (int)curtime);
-+  X509_set_serialNumber(cert, serial);
-+  ASN1_INTEGER_free(serial);
- 
--  ASN1_TIME_set(X509_get_notBefore(cert), curtime);
--  ASN1_TIME_set(X509_get_notAfter(cert), expiration_date);
--  ASN1_INTEGER_set(X509_get_serialNumber(cert), (int)curtime);
-   X509_set_pubkey(cert, pkey);
- 
--  name = X509_get_subject_name(cert);
-+  language = cupsLangDefault();
-+  name     = X509_NAME_new();
-   if (strlen(language->language) == 5)
--    X509_NAME_add_entry_by_txt(name, "C", MBSTRING_ASC, (unsigned char *)language->language + 3, -1, -1, 0);
-+    X509_NAME_add_entry_by_txt(name, SN_countryName, MBSTRING_ASC, (unsigned char *)language->language + 3, -1, -1, 0);
-   else
--    X509_NAME_add_entry_by_txt(name, "C", MBSTRING_ASC, (unsigned char *)"US", -1, -1, 0);
--  X509_NAME_add_entry_by_txt(name, "O", MBSTRING_ASC, (unsigned char *)"Unknown", -1, -1, 0);
--  X509_NAME_add_entry_by_txt(name, "CN", MBSTRING_ASC, (unsigned char *)common_name, -1, -1, 0);
-+    X509_NAME_add_entry_by_txt(name, SN_countryName, MBSTRING_ASC, (unsigned char *)"US", -1, -1, 0);
-+  X509_NAME_add_entry_by_txt(name, SN_commonName, MBSTRING_ASC, (unsigned char *)common_name, -1, -1, 0);
-+  X509_NAME_add_entry_by_txt(name, SN_organizationName, MBSTRING_ASC, (unsigned char *)common_name, -1, -1, 0);
-+  X509_NAME_add_entry_by_txt(name, SN_organizationalUnitName, MBSTRING_ASC, (unsigned char *)"Unknown", -1, -1, 0);
-+  X509_NAME_add_entry_by_txt(name, SN_stateOrProvinceName, MBSTRING_ASC, (unsigned char *)"Unknown", -1, -1, 0);
-+  X509_NAME_add_entry_by_txt(name, SN_localityName, MBSTRING_ASC, (unsigned char *)"Unknown", -1, -1, 0);
- 
-   X509_set_issuer_name(cert, name);
-+  X509_set_subject_name(cert, name);
-+  X509_NAME_free(name);
- 
--  http_x509_add_san(cert, common_name);
-+  gens = sk_GENERAL_NAME_new_null();
-+  http_x509_add_san(gens, common_name);
-   if ((common_ptr = strstr(common_name, ".local")) == NULL)
-   {
-     // Add common_name.local to the list, too...
-@@ -161,7 +184,7 @@
-       *localptr = '\0';
-     strlcat(localname, ".local", sizeof(localname));
- 
--    http_x509_add_san(cert, localname);
-+    http_x509_add_san(gens, localname);
-   }
- 
-   if (num_alt_names > 0)
-@@ -171,10 +194,22 @@
-     for (i = 0; i < num_alt_names; i ++)
-     {
-       if (strcmp(alt_names[i], "localhost"))
--        http_x509_add_san(cert, alt_names[i]);
-+        http_x509_add_san(gens, alt_names[i]);
-     }
-   }
- 
-+  // Add extension with DNS names and free buffer for GENERAL_NAME
-+  X509_add1_ext_i2d(cert, NID_subject_alt_name, gens, 0, X509V3_ADD_DEFAULT);
-+  sk_GENERAL_NAME_pop_free(gens, GENERAL_NAME_free);
-+
-+  // Add extensions that are required to make Chrome happy...
-+  http_x509_add_ext(cert, NID_basic_constraints, "critical,CA:FALSE,pathlen:0");
-+  http_x509_add_ext(cert, NID_key_usage, "critical,digitalSignature,keyEncipherment");
-+  http_x509_add_ext(cert, NID_ext_key_usage, "1.3.6.1.5.5.7.3.1");
-+  http_x509_add_ext(cert, NID_subject_key_identifier, "hash");
-+  http_x509_add_ext(cert, NID_authority_key_identifier, "keyid,issuer");
-+  X509_set_version(cert, 2); // v3
-+
-   X509_sign(cert, pkey, EVP_sha256());
- 
-   // Save them...
-@@ -959,6 +994,7 @@
-     const char	*cn,			// Common name to lookup
- 		*cnptr;			// Pointer into common name
-     int		have_creds = 0;		// Have credentials?
-+    int		key_status, crt_status;	// Key and certificate load status
- 
-     context = SSL_CTX_new(TLS_server_method());
- 
-@@ -1002,6 +1038,8 @@
-     else
-       cn = tls_common_name;
- 
-+    _cupsMutexLock(&tls_mutex);
-+
-     if (cn)
-     {
-       // First look in the CUPS keystore...
-@@ -1042,20 +1080,41 @@
-     {
-       DEBUG_printf(("4_httpTLSStart: Auto-create credentials for \"%s\".", cn));
- 
--      if (!cupsMakeServerCredentials(tls_keypath, cn, 0, NULL, time(NULL) + 365 * 86400))
-+      if (!cupsMakeServerCredentials(tls_keypath, cn, 0, NULL, time(NULL) + 3650 * 86400))
-       {
- 	DEBUG_puts("4_httpTLSStart: cupsMakeServerCredentials failed.");
- 	http->error  = errno = EINVAL;
- 	http->status = HTTP_STATUS_ERROR;
- 	_cupsSetError(IPP_STATUS_ERROR_INTERNAL, _("Unable to create server credentials."), 1);
--        SSL_CTX_free(context);
-+	SSL_CTX_free(context);
-+        _cupsMutexUnlock(&tls_mutex);
- 
- 	return (-1);
-       }
-     }
- 
--    SSL_CTX_use_PrivateKey_file(context, keyfile, SSL_FILETYPE_PEM);
--    SSL_CTX_use_certificate_file(context, crtfile, SSL_FILETYPE_PEM);
-+    _cupsMutexUnlock(&tls_mutex);
-+
-+    DEBUG_printf(("4_httpTLSStart: Using private key file '%s'.", keyfile));
-+    DEBUG_printf(("4_httpTLSStart: Using certificate file '%s'.", crtfile));
-+
-+    crt_status = SSL_CTX_use_certificate_chain_file(context, crtfile);
-+    key_status = SSL_CTX_use_PrivateKey_file(context, keyfile, SSL_FILETYPE_PEM);
-+
-+    if (!key_status || !crt_status)
-+    {
-+      // Unable to load private key or certificate...
-+      DEBUG_puts("4_httpTLSStart: Unable to use private key or certificate chain file.");
-+      if ((error = ERR_get_error()) != 0)
-+        _cupsSetError(IPP_STATUS_ERROR_CUPS_PKI, ERR_error_string(error, NULL), 0);
-+
-+      http->status = HTTP_STATUS_ERROR;
-+      http->error  = EIO;
-+
-+      SSL_CTX_free(context);
-+
-+      return (-1);
-+    }
-   }
- 
-   // Set TLS options...
-@@ -1068,6 +1127,8 @@
-     strlcat(cipherlist, ":!SHA1:!SHA256:!SHA384", sizeof(cipherlist));
-   strlcat(cipherlist, ":@STRENGTH", sizeof(cipherlist));
- 
-+  DEBUG_printf(("4_httpTLSStart: cipherlist='%s', tls_min_version=%d, tls_max_version=%d", cipherlist, tls_min_version, tls_max_version));
-+
-   SSL_CTX_set_min_proto_version(context, versions[tls_min_version]);
-   SSL_CTX_set_max_proto_version(context, versions[tls_max_version]);
-   SSL_CTX_set_cipher_list(context, cipherlist);
-@@ -1094,7 +1155,8 @@
- 
-   if (http->mode == _HTTP_MODE_CLIENT)
-   {
--    // Negotiate as a server...
-+    // Negotiate as a client...
-+    DEBUG_puts("4_httpTLSStart: Calling SSL_connect...");
-     if (SSL_connect(http->tls) < 1)
-     {
-       // Failed
-@@ -1109,12 +1171,15 @@
-       SSL_free(http->tls);
-       http->tls = NULL;
- 
-+      DEBUG_printf(("4_httpTLSStart: Returning -1 (%s)", ERR_error_string(error, NULL)));
-+
-       return (-1);
-     }
-   }
-   else
-   {
-     // Negotiate as a server...
-+    DEBUG_puts("4_httpTLSStart: Calling SSL_accept...");
-     if (SSL_accept(http->tls) < 1)
-     {
-       // Failed
-@@ -1129,10 +1194,14 @@
-       SSL_free(http->tls);
-       http->tls = NULL;
- 
-+      DEBUG_printf(("4_httpTLSStart: Returning -1 (%s)", ERR_error_string(error, NULL)));
-+
-       return (-1);
-     }
-   }
- 
-+  DEBUG_puts("4_httpTLSStart: Returning 0.");
-+
-   return (0);
- }
- 
-@@ -1152,6 +1221,8 @@
-   SSL_shutdown(http->tls);
-   SSL_CTX_free(context);
-   SSL_free(http->tls);
-+
-+  http->tls = NULL;
- }
- 
- 
-@@ -1564,32 +1635,62 @@
- 
- 
- //
--// 'http_x509_add_san()' - Add a subjectAltName extension to an X.509 certificate.
-+// 'http_x509_add_ext()' - Add an extension to a certificate.
- //
- 
--static void
--http_x509_add_san(X509       *cert,	// I - Certificate
--                  const char *name)	// I - Hostname
-+static int				// O - 1 on success, 0 on failure
-+http_x509_add_ext(X509       *cert,	// I - Certificate
-+                  int        nid,	// I - Extension ID
-+                  const char *value)	// I - Value
- {
--  char		dns_name[1024];		// DNS: prefixed hostname
--  X509_EXTENSION *san_ext;		// Extension for subjectAltName
--  ASN1_OCTET_STRING *san_asn1;		// ASN1 string
-+  int			ret;		// Return value
-+  X509_EXTENSION	*ex = NULL;	// Extension
-+  X509V3_CTX		ctx;		// Certificate context
- 
- 
--  // The subjectAltName value for DNS names starts with a DNS: prefix...
--  snprintf(dns_name, sizeof(dns_name), "DNS: %s", name);
-+  DEBUG_printf(("3http_x509_add_ext(cert=%p, nid=%d, value=\"%s\")", (void *)cert, nid, value));
- 
--  if ((san_asn1 = ASN1_OCTET_STRING_new()) == NULL)
--    return;
-+  // Don't use a configuration database...
-+  X509V3_set_ctx_nodb(&ctx);
- 
--  ASN1_OCTET_STRING_set(san_asn1, (unsigned char *)dns_name, strlen(dns_name));
--  if ((san_ext = X509_EXTENSION_create_by_NID(NULL, NID_subject_alt_name, 0, san_asn1)) == NULL)
-+  // Self-signed certificates use the same issuer and subject...
-+  X509V3_set_ctx(&ctx, /*issuer*/cert, /*subject*/cert, /*req*/NULL, /*crl*/NULL, /*flags*/0);
-+
-+  // Create and add the extension...
-+  if ((ex = X509V3_EXT_conf_nid(/*conf*/NULL, &ctx, nid, value)) == NULL)
-   {
--    ASN1_OCTET_STRING_free(san_asn1);
--    return;
-+    DEBUG_puts("4http_x509_add_ext: Unable to create extension, returning false.");
-+    return (0);
-   }
- 
--  X509_add_ext(cert, san_ext, -1);
--  X509_EXTENSION_free(san_ext);
--  ASN1_OCTET_STRING_free(san_asn1);
-+  ret = X509_add_ext(cert, ex, -1) != 0;
-+
-+  DEBUG_printf(("4http_x509_add_ext: X509_add_ext returned %s.", ret ? "true" : "false"));
-+
-+  // Free the extension and return...
-+  X509_EXTENSION_free(ex);
-+
-+  return (ret);
-+}
-+
-+
-+//
-+// 'http_x509_add_san()' - Add a subjectAltName to GENERAL_NAMES used for
-+//                         the extension to an X.509 certificate.
-+//
-+
-+static void
-+http_x509_add_san(GENERAL_NAMES *gens,	// I - Concatenation of DNS names
-+                  const char    *name)	// I - Hostname
-+{
-+  GENERAL_NAME *gen_dns = GENERAL_NAME_new();
-+					// DNS: name
-+  ASN1_IA5STRING *ia5 = ASN1_IA5STRING_new();
-+					// Hostname string
-+
-+
-+  // Set the strings and push it on the GENERAL_NAMES list...
-+  ASN1_STRING_set(ia5, name, strlen(name));
-+  GENERAL_NAME_set0_value(gen_dns, GEN_DNS, ia5);
-+  sk_GENERAL_NAME_push(gens, gen_dns);
- }
diff --git a/src/patches/cups-2.4.2_Fix_default_cupsd_keychain_with_OpenSSL.patch b/src/patches/cups-2.4.2_Fix_default_cupsd_keychain_with_OpenSSL.patch
deleted file mode 100644
index ebd3a4843..000000000
--- a/src/patches/cups-2.4.2_Fix_default_cupsd_keychain_with_OpenSSL.patch
+++ /dev/null
@@ -1,16 +0,0 @@ 
---- cups-2.4.2/scheduler/conf.c.orig	2022-05-26 08:17:21.000000000 +0200
-+++ cups-2.4.2/scheduler/conf.c	2023-04-23 15:37:48.521145700 +0200
-@@ -605,11 +605,11 @@
-   ClassifyOverride  = 0;
- 
- #ifdef HAVE_TLS
--#  ifdef HAVE_GNUTLS
-+#  if defined HAVE_GNUTLS || defined HAVE_OPENSSL
-   cupsdSetString(&ServerKeychain, "ssl");
- #  else
-   cupsdSetString(&ServerKeychain, "/Library/Keychains/System.keychain");
--#  endif /* HAVE_GNUTLS */
-+#  endif /* HAVE_GNUTLS || HAVE_OPENSSL */
- 
-   _httpTLSSetOptions(_HTTP_TLS_NONE, _HTTP_TLS_1_0, _HTTP_TLS_MAX);
- #endif /* HAVE_TLS */