From: Michael R Sweet Date: Mon, 15 Apr 2019 20:04:28 +0000 (-0400) Subject: Correctly encode octetString values for print filters (Issue #5558) X-Git-Tag: v2.2.12~30 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=803b6de89a8ec5ac3e4db8107c74d2535b410189;p=thirdparty%2Fcups.git Correctly encode octetString values for print filters (Issue #5558) scheduler/job.c: - get_options(): Correctly encode IPP_TAG_STRING as a quoted string or a hex string depending on the value. - ipp_length(): Handle IPP_TAG_STRING separately. --- diff --git a/CHANGES.md b/CHANGES.md index 8b3d309053..f0925f640d 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -1,7 +1,14 @@ -CHANGES - 2.2.11 - 2019-03-22 +CHANGES - 2.2.12 - 2019-04-15 ============================= +Changes in CUPS v2.2.12 +----------------------- + +- The scheduler did not encode octetString values like "job-password" correctly + for the print filters (Issue #5558) + + Changes in CUPS v2.2.11 ----------------------- diff --git a/scheduler/job.c b/scheduler/job.c index 4f041388c4..8218bfdc45 100644 --- a/scheduler/job.c +++ b/scheduler/job.c @@ -4021,6 +4021,45 @@ get_options(cupsd_job_t *job, /* I - Job */ break; case IPP_TAG_STRING : + { + int length = attr->values[i].unknown.length; + + for (valptr = attr->values[i].unknown.data; length > 0; length --) + { + if ((*valptr & 255) < 0x20 || *valptr == 0x7f) + break; + } + + if (length > 0) + { + /* + * Encode this string as hex characters... + */ + + *optptr++ = '<'; + + for (valptr = attr->values[i].unknown.data, length = attr->values[i].unknown.length; length > 0; length --) + { + snprintf(optptr, optlength - (size_t)(optptr - options) - 1, "%02X", *valptr & 255); + optptr += 2; + } + + *optptr++ = '>'; + } + else + { + for (valptr = attr->values[i].unknown.data, length = attr->values[i].unknown.length; length > 0; length --) + { + if (strchr(" \t\n\\\'\"", *valptr)) + *optptr++ = '\\'; + *optptr++ = *valptr++; + } + } + } + + *optptr = '\0'; + break; + case IPP_TAG_TEXT : case IPP_TAG_NAME : case IPP_TAG_KEYWORD : @@ -4166,6 +4205,16 @@ ipp_length(ipp_t *ipp) /* I - IPP request */ break; case IPP_TAG_STRING : + /* + * Octet strings can contain characters that need quoting. We need + * at least 2 * len + 2 characters to cover the quotes and any + * backslashes in the string. + */ + + for (i = 0; i < attr->num_values; i ++) + bytes += 2 * (size_t)attr->values[i].unknown.length + 2; + break; + case IPP_TAG_TEXT : case IPP_TAG_NAME : case IPP_TAG_KEYWORD :