]> git.ipfire.org Git - thirdparty/cups.git/commitdiff
Correctly encode octetString values for print filters (Issue #5558)
authorMichael R Sweet <michael.r.sweet@gmail.com>
Mon, 15 Apr 2019 20:03:03 +0000 (16:03 -0400)
committerMichael R Sweet <michael.r.sweet@gmail.com>
Mon, 15 Apr 2019 20:03:03 +0000 (16:03 -0400)
scheduler/job.c:
- get_options(): Handle IPP_TAG_STRING separately and either provide a quoted
  string or a hex string, depending on the value.
- ipp_length(): Handle IPP_TAG_STRING separately.

CHANGES.md
scheduler/job.c

index a44c3f19df045013dd94de431ebbd19ac95484f9..ce41c8367f17d7761e0a0ce63b0cc87f4f27a3ed 100644 (file)
@@ -9,6 +9,8 @@ Changes in CUPS v2.3b8
 - The lpadmin command would hang with a bad PPD file (rdar://41495016)
 - Fixed a potential crash bug in cups-driverd (rdar://46625579)
 - Fixed a performance regression with large PPDs (rdar://47040759)
+- The scheduler did not encode octetString values like "job-password" correctly
+  for the print filters (Issue #5558)
 - The `ippValidateAttribute` function did not catch all instances of invalid
   UTF-8 strings (Issue #5509)
 - Fixed an issue with the self-signed certificates generated by GNU TLS
index fe8eeb7c9803e4098cdd9efb8e0537b3d2c7ee8f..092d87962a42d0d8062d7c098f8315b276874f7e 100644 (file)
@@ -4030,6 +4030,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 :
@@ -4175,6 +4214,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 :