Skip to content

Commit 399ad15

Browse files
committed
Filter out control characters from option values.
1 parent af366b1 commit 399ad15

1 file changed

Lines changed: 35 additions & 6 deletions

File tree

scheduler/job.c

Lines changed: 35 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)