diff options
author | Pacho Ramos <pacho@gentoo.org> | 2023-01-07 18:34:01 +0100 |
---|---|---|
committer | Pacho Ramos <pacho@gentoo.org> | 2023-01-07 18:34:01 +0100 |
commit | 1602d101b991eb7f07e7ee84828ce5255bdda6d3 (patch) | |
tree | 04a55339702e828dbbf2a20ae6fee6f1c7c3a23f /net-print/cups/files | |
parent | sys-kernel/gentoo-kernel-bin: Bump to 6.0.18 (diff) | |
download | gentoo-1602d101b991eb7f07e7ee84828ce5255bdda6d3.tar.gz gentoo-1602d101b991eb7f07e7ee84828ce5255bdda6d3.tar.bz2 gentoo-1602d101b991eb7f07e7ee84828ce5255bdda6d3.zip |
net-print/cups: Apply Fedora fixes for IPP and .local discovering
To make the printing and the detection far more reliable.
Signed-off-by: Pacho Ramos <pacho@gentoo.org>
Diffstat (limited to 'net-print/cups/files')
-rw-r--r-- | net-print/cups/files/cups-2.4.2-scheduler-ipp.patch | 36 | ||||
-rw-r--r-- | net-print/cups/files/cups-resolve-local.patch | 97 |
2 files changed, 133 insertions, 0 deletions
diff --git a/net-print/cups/files/cups-2.4.2-scheduler-ipp.patch b/net-print/cups/files/cups-2.4.2-scheduler-ipp.patch new file mode 100644 index 000000000000..54147c60de96 --- /dev/null +++ b/net-print/cups/files/cups-2.4.2-scheduler-ipp.patch @@ -0,0 +1,36 @@ +From 020609ad9eb84ab5a4c602ff604b2f208a6cdb8d Mon Sep 17 00:00:00 2001 +From: Zdenek Dohnal <zdohnal@redhat.com> +Date: Wed, 22 Jun 2022 09:23:45 +0200 +Subject: [PATCH] scheduler/ipp.c: Allocate device_uri via cupsdSetString() + +If a driverless printer has .local in its URI, we resolve the +URI and save the resolved one as new device URI. The problem was that +a local pointer was assigned to the structure which is passed to the +function as parameter, so the pointer became invalid once the execution +left the create_local_bg_thread() function. + +We need to allocate the device URI via cupsdSetString() - the string is +then freed when the printer is deleted or cupsd shuts down. + +Fixes #419. +--- + CHANGES.md | 1 + + scheduler/ipp.c | 2 +- + 2 files changed, 2 insertions(+), 1 deletion(-) + +diff --git a/scheduler/ipp.c b/scheduler/ipp.c +index 3a849bdb5..b722712f6 100644 +--- a/scheduler/ipp.c ++++ b/scheduler/ipp.c +@@ -5307,7 +5307,7 @@ create_local_bg_thread( + return (NULL); + } + +- printer->device_uri = uri; ++ cupsdSetString(&printer->device_uri, uri); + } + + if (httpSeparateURI(HTTP_URI_CODING_ALL, printer->device_uri, scheme, sizeof(scheme), userpass, sizeof(userpass), host, sizeof(host), &port, resource, sizeof(resource)) < HTTP_URI_STATUS_OK) +-- +2.37.1 + diff --git a/net-print/cups/files/cups-resolve-local.patch b/net-print/cups/files/cups-resolve-local.patch new file mode 100644 index 000000000000..bc6c96a98211 --- /dev/null +++ b/net-print/cups/files/cups-resolve-local.patch @@ -0,0 +1,97 @@ +diff --git a/scheduler/ipp.c b/scheduler/ipp.c +index 9984b79..dd85173 100644 +--- a/scheduler/ipp.c ++++ b/scheduler/ipp.c +@@ -5898,6 +5898,11 @@ create_local_printer( + *nameptr, /* Pointer into name */ + uri[1024]; /* printer-uri-supported value */ + const char *ptr; /* Pointer into attribute value */ ++ char scheme[HTTP_MAX_URI], /* Scheme portion of URI */ ++ userpass[HTTP_MAX_URI], /* Username portion of URI */ ++ host[HTTP_MAX_URI], /* Host portion of URI */ ++ resource[HTTP_MAX_URI]; /* Resource portion of URI */ ++ int port; /* Port portion of URI */ + + + /* +@@ -5961,6 +5966,13 @@ create_local_printer( + + return; + } ++ ptr = ippGetString(device_uri, 0, NULL); ++ if (!ptr || !ptr[0]) ++ { ++ send_ipp_status(con, IPP_STATUS_ERROR_BAD_REQUEST, _("Attribute \"%s\" has empty value."), "device-uri"); ++ ++ return; ++ } + + printer_geo_location = ippFindAttribute(con->request, "printer-geo-location", IPP_TAG_URI); + printer_info = ippFindAttribute(con->request, "printer-info", IPP_TAG_TEXT); +@@ -5989,7 +6001,65 @@ create_local_printer( + printer->shared = 0; + printer->temporary = 1; + +- cupsdSetDeviceURI(printer, ippGetString(device_uri, 0, NULL)); ++ /* ++ * Check device URI if it has the same hostname as we have, if so, replace ++ * the hostname by localhost. This way we assure that local-only services ++ * like ipp-usb or Printer Applications always work. ++ * ++ * When comparing our hostname with the one in the device URI, ++ * consider names with or without trailing dot ('.') the same. Also ++ * compare case-insensitively. ++ */ ++ ++#ifdef HAVE_DNSSD ++ if (DNSSDHostName) ++ nameptr = DNSSDHostName; ++ else ++#endif ++ if (ServerName) ++ nameptr = ServerName; ++ else ++ nameptr = NULL; ++ ++ if (nameptr) ++ { ++ int host_len, ++ server_name_len; ++ ++ /* Get host name of device URI */ ++ httpSeparateURI(HTTP_URI_CODING_ALL, ptr, ++ scheme, sizeof(scheme), userpass, sizeof(userpass), host, ++ sizeof(host), &port, resource, sizeof(resource)); ++ ++ /* Take trailing dot out of comparison */ ++ host_len = strlen(host); ++ if (host_len > 1 && host[host_len - 1] == '.') ++ host_len --; ++ ++ server_name_len = strlen(nameptr); ++ if (server_name_len > 1 && nameptr[server_name_len - 1] == '.') ++ server_name_len --; ++ ++ /* ++ * If we have no DNSSDHostName but only a ServerName (if we are not ++ * sharing printers, Browsing = Off) the ServerName has no ".local" ++ * but the requested device URI has. Take this into account. ++ */ ++ ++ if (nameptr == ServerName && host_len >= 6 && (server_name_len < 6 || strcmp(nameptr + server_name_len - 6, ".local") != 0) && strcmp(host + host_len - 6, ".local") == 0) ++ host_len -= 6; ++ ++ if (host_len == server_name_len && strncasecmp(host, nameptr, host_len) == 0) ++ ptr = "localhost"; ++ else ++ ptr = host; ++ ++ httpAssembleURI(HTTP_URI_CODING_ALL, uri, sizeof(uri), scheme, userpass, ++ ptr, port, resource); ++ cupsdSetDeviceURI(printer, uri); ++ } ++ else ++ cupsdSetDeviceURI(printer, ptr); + + if (printer_geo_location) + cupsdSetString(&printer->geo_location, ippGetString(printer_geo_location, 0, NULL)); |