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);