diff --git a/cups-filters-init-buf.patch b/cups-filters-init-buf.patch new file mode 100644 index 0000000..42e6f94 --- /dev/null +++ b/cups-filters-init-buf.patch @@ -0,0 +1,186 @@ +diff --git a/cupsfilters/ipp.c b/cupsfilters/ipp.c +index 21861a5..98c5ecf 100644 +--- a/cupsfilters/ipp.c ++++ b/cupsfilters/ipp.c +@@ -191,7 +191,7 @@ get_printer_attributes5(http_t *http_printer, + { + const char *uri; + int have_http, uri_status, host_port, i = 0, total_attrs = 0, fallback, +- cap = 0; ++ cap = 0, uri_alloc = 0; + char scheme[10], userpass[1024], host_name[1024], resource[1024]; + ipp_t *request, *response = NULL; + ipp_attribute_t *attr; +@@ -247,7 +247,18 @@ get_printer_attributes5(http_t *http_printer, + if(resolve_uri_type == CUPS_BACKEND_URI_CONVERTER) + uri = resolve_uri(raw_uri); + else ++ { + uri = ippfind_based_uri_converter(raw_uri, resolve_uri_type); ++ if (uri != NULL) ++ uri_alloc = 1; ++ } ++ ++ if (uri == NULL) ++ { ++ log_printf(get_printer_attributes_log, ++ "get-printer-attibutes: Cannot resolve URI: %s\n", raw_uri); ++ return NULL; ++ } + + /* Extract URI componants needed for the IPP request */ + uri_status = httpSeparateURI(HTTP_URI_CODING_ALL, uri, +@@ -261,6 +272,7 @@ get_printer_attributes5(http_t *http_printer, + log_printf(get_printer_attributes_log, + "get-printer-attributes: Cannot parse the printer URI: %s\n", + uri); ++ if (uri_alloc == 1) free(uri); + return NULL; + } + +@@ -273,6 +285,7 @@ get_printer_attributes5(http_t *http_printer, + log_printf(get_printer_attributes_log, + "get-printer-attributes: Cannot connect to printer with URI %s.\n", + uri); ++ if (uri_alloc == 1) free(uri); + return NULL; + } + } else +@@ -370,6 +383,7 @@ get_printer_attributes5(http_t *http_printer, + } else { + /* Suitable response, we are done */ + if (have_http == 0) httpClose(http_printer); ++ if (uri_alloc == 1) free(uri); + return response; + } + } else { +@@ -398,6 +412,7 @@ get_printer_attributes5(http_t *http_printer, + } + + if (have_http == 0) httpClose(http_printer); ++ if (uri_alloc == 1) free(uri); + return NULL; + } + +@@ -418,7 +433,7 @@ ippfind_based_uri_converter (const char *uri, int is_fax) + char *ippfind_argv[100], /* Arguments for ippfind */ + *ptr_to_port = NULL, + *reg_type, +- *resolved_uri, /* Buffer for resolved URI */ ++ *resolved_uri = NULL, /* Buffer for resolved URI */ + *resource_field = NULL, + *service_hostname = NULL, + /* URI components... */ +@@ -426,13 +441,11 @@ ippfind_based_uri_converter (const char *uri, int is_fax) + userpass[256], + hostname[1024], + resource[1024], +- buffer[8192], /* Copy buffer */ ++ *buffer = NULL, /* Copy buffer */ + *ptr; /* Pointer into string */; + cups_file_t *fp; /* Post-processing input file */ + int status; /* Status of GET request */ + +- resolved_uri = (char *)malloc(2048 * (sizeof(char))); +- + status = httpSeparateURI(HTTP_URI_CODING_ALL, uri, scheme, sizeof(scheme), + userpass, sizeof(userpass), + hostname, sizeof(hostname), &port, resource, +@@ -445,10 +458,16 @@ ippfind_based_uri_converter (const char *uri, int is_fax) + + /* URI is not DNS-SD-based, so do not resolve */ + if ((reg_type = strstr(hostname, "._tcp")) == NULL) { +- free(resolved_uri); + return strdup(uri); + } + ++ resolved_uri = (char *)malloc(MAX_URI_LEN * (sizeof(char))); ++ if (resolved_uri == NULL) { ++ fprintf(stderr, "resolved_uri malloc: Out of memory\n"); ++ goto error; ++ } ++ memset(resolved_uri, 0, MAX_URI_LEN); ++ + reg_type --; + while (reg_type >= hostname && *reg_type != '.') + reg_type --; +@@ -523,26 +542,38 @@ ippfind_based_uri_converter (const char *uri, int is_fax) + + fp = cupsFileStdin(); + +- while ((bytes = cupsFileGetLine(fp, buffer, sizeof(buffer))) > 0) { ++ buffer = (char*)malloc(MAX_OUTPUT_LEN * sizeof(char)); ++ if (buffer == NULL) { ++ fprintf(stderr, "buffer malloc: Out of memory.\n"); ++ goto error; ++ } ++ memset(buffer, 0, MAX_OUTPUT_LEN); ++ ++ while ((bytes = cupsFileGetLine(fp, buffer, MAX_OUTPUT_LEN)) > 0) { + /* Mark all the fields of the output of ippfind */ + ptr = buffer; ++ ++ /* ignore new lines */ ++ if (bytes < 3) ++ goto read_error; ++ + /* First, build the DNS-SD-service-name-based URI ... */ + while (ptr && !isalnum(*ptr & 255)) ptr ++; + + service_hostname = ptr; +- ptr = memchr(ptr, '\t', sizeof(buffer) - (ptr - buffer)); ++ ptr = memchr(ptr, '\t', MAX_OUTPUT_LEN - (ptr - buffer)); + if (!ptr) goto read_error; + *ptr = '\0'; + ptr ++; + + resource_field = ptr; +- ptr = memchr(ptr, '\t', sizeof(buffer) - (ptr - buffer)); ++ ptr = memchr(ptr, '\t', MAX_OUTPUT_LEN - (ptr - buffer)); + if (!ptr) goto read_error; + *ptr = '\0'; + ptr ++; + + ptr_to_port = ptr; +- ptr = memchr(ptr, '\t', sizeof(buffer) - (ptr - buffer)); ++ ptr = memchr(ptr, '\t', MAX_OUTPUT_LEN - (ptr - buffer)); + if (!ptr) goto read_error; + *ptr = '\0'; + ptr ++; +@@ -566,9 +597,12 @@ ippfind_based_uri_converter (const char *uri, int is_fax) + output_of_fax_uri = 1; /* fax-uri requested from fax-capable device */ + + read_error: +- continue; ++ memset(buffer, 0, MAX_OUTPUT_LEN); + } + ++ if (buffer != NULL) ++ free(buffer); ++ + /* + * Wait for the child processes to exit... + */ +@@ -615,6 +649,8 @@ ippfind_based_uri_converter (const char *uri, int is_fax) + */ + + error: ++ if (resolved_uri != NULL) ++ free(resolved_uri); + return (NULL); + } + +diff --git a/cupsfilters/ipp.h b/cupsfilters/ipp.h +index 374b890..bcf22a8 100644 +--- a/cupsfilters/ipp.h ++++ b/cupsfilters/ipp.h +@@ -38,6 +38,9 @@ extern "C" { + #endif + + #define LOGSIZE 4 * 65536 ++#define MAX_OUTPUT_LEN 8192 ++#define MAX_URI_LEN 2048 ++ + char get_printer_attributes_log[LOGSIZE]; + + const char *resolve_uri(const char *raw_uri); diff --git a/cups-filters.spec b/cups-filters.spec index 2894de5..f326cd6 100644 --- a/cups-filters.spec +++ b/cups-filters.spec @@ -4,7 +4,7 @@ Summary: OpenPrinting CUPS filters and backends Name: cups-filters Version: 1.28.2 -Release: 1%{?dist} +Release: 2%{?dist} # For a breakdown of the licensing, see COPYING file # GPLv2: filters: commandto*, imagetoraster, pdftops, rasterto*, @@ -20,6 +20,7 @@ License: GPLv2 and GPLv2+ and GPLv3 and GPLv3+ and LGPLv2+ and MIT and BSD with Url: http://www.linuxfoundation.org/collaborate/workgroups/openprinting/cups-filters Source0: http://www.openprinting.org/download/cups-filters/cups-filters-%{version}.tar.xz +Patch01: cups-filters-init-buf.patch Requires: cups-filters-libs%{?_isa} = %{version}-%{release} @@ -347,6 +348,9 @@ done %{_libdir}/libfontembed.so %changelog +* Thu Sep 17 2020 Zdenek Dohnal - 1.28.2-2 +- 1879147 - driverless cannot generate ppd for dns-sd based uris + * Tue Sep 15 2020 Zdenek Dohnal - 1.28.2-1 - 1.28.2