- 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
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 :
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 :