@@ -4137,9 +4137,21 @@ get_options(cupsd_job_t *job, /* I - Job */
41374137 case IPP_TAG_URI :
41384138 for (valptr = attr -> values [i ].string .text ; * valptr ;)
41394139 {
4140- if (strchr (" \t\n\\\'\"" , * valptr ))
4141- * optptr ++ = '\\' ;
4142- * optptr ++ = * valptr ++ ;
4140+ /*
4141+ * Convert tabs and newlines to spaces, filter out control chars,
4142+ * and escape \, ', and ".
4143+ */
4144+
4145+ if (isspace (* valptr & 255 ))
4146+ {
4147+ * optptr ++ = ' ' ;
4148+ }
4149+ else if ((* valptr & 255 ) >= ' ' && * valptr != 0x7f )
4150+ {
4151+ if (strchr ("\\\'\"" , * valptr ))
4152+ * optptr ++ = '\\' ;
4153+ * optptr ++ = * valptr ++ ;
4154+ }
41434155 }
41444156
41454157 * optptr = '\0' ;
@@ -5422,13 +5434,30 @@ update_job(cupsd_job_t *job) /* I - Job to check */
54225434 else if (loglevel == CUPSD_LOG_PPD )
54235435 {
54245436 /*
5425- * Set attribute (s)...
5437+ * Set PPD keyword(s)/value (s)...
54265438 */
54275439
5440+ int i , /* Looping var */
5441+ num_keywords ; /* Number of keywords */
5442+ cups_option_t * keywords , /* Keywords */
5443+ * keyword ; /* Current keyword */
5444+
54285445 cupsdLogJob (job , CUPSD_LOG_DEBUG , "PPD: %s" , message );
54295446
5430- job -> num_keywords = cupsParseOptions (message , job -> num_keywords ,
5431- & job -> keywords );
5447+ keywords = NULL ;
5448+ num_keywords = cupsParseOptions (message , 0 , & keywords );
5449+
5450+ for (i = 0 , keyword = keywords ; i < num_keywords ; i ++ )
5451+ {
5452+ /*
5453+ * Filter out "special" PPD keywords...
5454+ */
5455+
5456+ if (strcmp (keyword -> name , "cupsFilter" ) && strcmp (keyword -> name , "cupsFilter2" ) && strcmp (keyword -> name , "cupsFinishingTemplate" ) && strcmp (keyword -> name , "cupsIPPFinishings" ) && strcmp (keyword -> name , "cupsIPPReason" ) && strcmp (keyword -> name , "cupsMarkerName" ) && strcmp (keyword -> name , "cupsMaxSize" ) && strncmp (keyword -> name , "cupsMediaQualifier" , 18 ) && strcmp (keyword -> name , "cupsMinSize" ) && strcmp (keyword -> name , "cupsPageSizeCategory" ) && strcmp (keyword -> name , "cupsPortMonitor" ) && strcmp (keyword -> name , "cupsPreFilter" ) && strcmp (keyword -> name , "cupsPrintQuality" ) && strcmp (keyword -> name , "APPrinterPreset" ))
5457+ job -> num_keywords = cupsAddOption (keyword -> name , keyword -> value , job -> num_keywords , & job -> keywords );
5458+ }
5459+
5460+ cupsFreeOptions (num_keywords , keywords );
54325461 }
54335462 else
54345463 {
0 commit comments