5701N/A/*-------------------------------------------------------------------------------------------------
5701N/AThis patch is taken from the community.
5701N/ADetails can be found at http://www.cups.org/str.php?L4609
5701N/A---------------------------------------------------------------------------------------------------*/
5701N/A
5701N/AIndex: cgi-bin/ipp-var.c
5701N/A===================================================================
5701N/A--- cgi-bin/ipp-var.c (revision 12588)
5701N/A+++ cgi-bin/ipp-var.c (working copy)
5701N/A@@ -1230,21 +1230,7 @@
5701N/A * Rewrite URIs...
5701N/A */
5701N/A
5701N/A- if (!strcmp(name, "member_uris"))
5701N/A- {
5701N/A- char url[1024]; /* URL for class member... */
5701N/A-
5701N/A-
5701N/A- cgiRewriteURL(attr->values[i].string.text, url,
5701N/A- sizeof(url), NULL);
5701N/A-
5701N/A- snprintf(valptr, sizeof(value) - (valptr - value),
5701N/A- "<A HREF=\"%s\">%s</A>", url,
5701N/A- strrchr(attr->values[i].string.text, '/') + 1);
5701N/A- }
5701N/A- else
5701N/A- cgiRewriteURL(attr->values[i].string.text, valptr,
5701N/A- sizeof(value) - (valptr - value), NULL);
5701N/A+ cgiRewriteURL(attr->values[i].string.text, valptr, sizeof(value) - (valptr - value), NULL);
5701N/A break;
5701N/A }
5701N/A
5701N/AIndex: cgi-bin/template.c
5701N/A===================================================================
5701N/A--- cgi-bin/template.c (revision 12588)
5701N/A+++ cgi-bin/template.c (working copy)
5701N/A@@ -659,39 +659,7 @@
5701N/A while (*s)
5701N/A {
5701N/A if (*s == '<')
5701N/A- {
5701N/A- /*
5701N/A- * Pass <A HREF="url"> and </A>, otherwise quote it...
5701N/A- */
5701N/A-
5701N/A- if (!strncasecmp(s, "<A HREF=\"", 9))
5701N/A- {
5701N/A- fputs("<A HREF=\"", out);
5701N/A- s += 9;
5701N/A-
5701N/A- while (*s && *s != '\"')
5701N/A- {
5701N/A- if (*s == '&')
5701N/A- fputs("&amp;", out);
5701N/A- else
5701N/A- putc(*s, out);
5701N/A-
5701N/A- s ++;
5701N/A- }
5701N/A-
5701N/A- if (*s)
5701N/A- s ++;
5701N/A-
5701N/A- fputs("\">", out);
5701N/A- }
5701N/A- else if (!strncasecmp(s, "</A>", 4))
5701N/A- {
5701N/A- fputs("</A>", out);
5701N/A- s += 3;
5701N/A- }
5701N/A- else
5701N/A- fputs("&lt;", out);
5701N/A- }
5701N/A+ fputs("&lt;", out);
5701N/A else if (*s == '>')
5701N/A fputs("&gt;", out);
5701N/A else if (*s == '\"')
5701N/AIndex: scheduler/ipp.c
5701N/A===================================================================
5701N/A--- scheduler/ipp.c (revision 12588)
5701N/A+++ scheduler/ipp.c (working copy)
5701N/A@@ -498,8 +498,8 @@
5701N/A * Remote unauthenticated user masquerading as local root...
5701N/A */
5701N/A
5701N/A- _cupsStrFree(username->values[0].string.text);
5701N/A- username->values[0].string.text = _cupsStrAlloc(RemoteRoot);
5701N/A+ _cupsStrFree(username->values[0].string.text);
5701N/A+ username->values[0].string.text = _cupsStrAlloc(RemoteRoot);
5701N/A }
5701N/A }
5701N/A
5701N/A@@ -1638,7 +1638,10 @@
5701N/A cupsdSetString(&job->username, con->username);
5701N/A
5701N/A if (attr)
5701N/A- cupsdSetString(&attr->values[0].string.text, con->username);
5701N/A+ {
5701N/A+ _cupsStrFree(attr->values[0].string.text);
5701N/A+ attr->values[0].string.text = _cupsStrAlloc(con->username);
5701N/A+ }
5701N/A }
5701N/A else if (attr)
5701N/A {
5701N/A@@ -1869,48 +1869,11 @@
5701N/A * Also, we can only have 1 value and it must be a name value.
5701N/A */
5701N/A
5701N/A- switch (attr->value_tag)
5701N/A- {
5701N/A- case IPP_TAG_STRING :
5701N/A- case IPP_TAG_TEXTLANG :
5701N/A- case IPP_TAG_NAMELANG :
5701N/A- case IPP_TAG_TEXT :
5701N/A- case IPP_TAG_NAME :
5701N/A- case IPP_TAG_KEYWORD :
5701N/A- case IPP_TAG_URI :
5701N/A- case IPP_TAG_URISCHEME :
5701N/A- case IPP_TAG_CHARSET :
5701N/A- case IPP_TAG_LANGUAGE :
5701N/A- case IPP_TAG_MIMETYPE :
5701N/A- /*
5701N/A- * Free old strings...
5701N/A- */
5701N/A-
5701N/A- for (i = 0; i < attr->num_values; i ++)
5701N/A- {
5701N/A- _cupsStrFree(attr->values[i].string.text);
5701N/A- attr->values[i].string.text = NULL;
5701N/A- if (attr->values[i].string.charset)
5701N/A- {
5701N/A- _cupsStrFree(attr->values[i].string.charset);
5701N/A- attr->values[i].string.charset = NULL;
5701N/A- }
5701N/A- }
5701N/A-
5701N/A- default :
5701N/A- break;
5701N/A- }
5701N/A-
5701N/A- /*
5701N/A- * Use the default connection hostname instead...
5701N/A- */
5701N/A-
5701N/A- attr->value_tag = IPP_TAG_NAME;
5701N/A- attr->num_values = 1;
5701N/A- attr->values[0].string.text = _cupsStrAlloc(con->http.hostname);
5701N/A- }
5701N/A-
5701N/A- attr->group_tag = IPP_TAG_JOB;
5701N/A+ ippDeleteAttribute(job->attrs, attr);
5701N/A+ ippAddString(job->attrs, IPP_TAG_JOB, IPP_TAG_NAME, "job-originating-host-name", NULL, con->http.hostname);
5701N/A+ }
5701N/A+ else
5701N/A+ attr->group_tag = IPP_TAG_JOB;
5701N/A }
5701N/A else
5701N/A {
5701N/A@@ -1822,8 +1788,8 @@
5701N/A
5701N/A attr = ippAddStrings(job->attrs, IPP_TAG_JOB, IPP_TAG_NAME, "job-sheets",
5701N/A 2, NULL, NULL);
5701N/A- attr->values[0].string.text = _cupsStrRetain(printer->job_sheets[0]);
5701N/A- attr->values[1].string.text = _cupsStrRetain(printer->job_sheets[1]);
5701N/A+ attr->values[0].string.text = _cupsStrAlloc(printer->job_sheets[0]);
5701N/A+ attr->values[1].string.text = _cupsStrAlloc(printer->job_sheets[1]);
5701N/A }
5701N/A
5701N/A job->job_sheets = attr;
5701N/A@@ -1849,7 +1815,8 @@
5701N/A * Force the leading banner to have the classification on it...
5701N/A */
5701N/A
5701N/A- cupsdSetString(&attr->values[0].string.text, Classification);
5701N/A+ _cupsStrFree(attr->values[0].string.text);
5701N/A+ attr->values[0].string.text = _cupsStrAlloc(Classification);
5701N/A
5701N/A cupsdLogJob(job, CUPSD_LOG_NOTICE, "CLASSIFICATION FORCED "
5701N/A "job-sheets=\"%s,none\", "
5701N/A@@ -1866,7 +1833,8 @@
5701N/A * Can't put two different security markings on the same document!
5701N/A */
5701N/A
5701N/A- cupsdSetString(&attr->values[1].string.text, attr->values[0].string.text);
5701N/A+ _cupsStrFree(attr->values[1].string.text);
5701N/A+ attr->values[1].string.text = _cupsStrAlloc(attr->values[0].string.text);
5701N/A
5701N/A cupsdLogJob(job, CUPSD_LOG_NOTICE, "CLASSIFICATION FORCED "
5701N/A "job-sheets=\"%s,%s\", "
5701N/A@@ -1906,18 +1874,26 @@
5701N/A if (attr->num_values > 1 &&
5701N/A !strcmp(attr->values[0].string.text, attr->values[1].string.text))
5701N/A {
5701N/A- cupsdSetString(&(attr->values[0].string.text), Classification);
5701N/A- cupsdSetString(&(attr->values[1].string.text), Classification);
5701N/A+ _cupsStrFree(attr->values[0].string.text);
5701N/A+ attr->values[0].string.text = _cupsStrAlloc(Classification);
5701N/A+ _cupsStrFree(attr->values[1].string.text);
5701N/A+ attr->values[1].string.text = _cupsStrAlloc(Classification);
5701N/A }
5701N/A else
5701N/A {
5701N/A if (attr->num_values == 1 ||
5701N/A strcmp(attr->values[0].string.text, "none"))
5701N/A- cupsdSetString(&(attr->values[0].string.text), Classification);
5701N/A+ {
5701N/A+ _cupsStrFree(attr->values[0].string.text);
5701N/A+ attr->values[0].string.text = _cupsStrAlloc(Classification);
5701N/A+ }
5701N/A
5701N/A if (attr->num_values > 1 &&
5701N/A strcmp(attr->values[1].string.text, "none"))
5701N/A- cupsdSetString(&(attr->values[1].string.text), Classification);
5701N/A+ {
5701N/A+ _cupsStrFree(attr->values[1].string.text);
5701N/A+ attr->values[1].string.text = _cupsStrAlloc(Classification);
5701N/A+ }
5701N/A }
5701N/A
5701N/A if (attr->num_values > 1)
5701N/A@@ -3845,7 +3821,8 @@
5701N/A if (attr)
5701N/A {
5701N/A attr->value_tag = IPP_TAG_KEYWORD;
5701N/A- cupsdSetString(&(attr->values[0].string.text), "no-hold");
5701N/A+ _cupsStrFree(attr->values[0].string.text);
5701N/A+ attr->values[0].string.text = _cupsStrAlloc("no-hold");
5701N/A }
5701N/A
5701N/A /*
5701N/A@@ -8832,7 +8809,6 @@
5701N/A if (format)
5701N/A {
5701N/A _cupsStrFree(format->values[0].string.text);
5701N/A-
5701N/A format->values[0].string.text = _cupsStrAlloc(mimetype);
5701N/A }
5701N/A else
5701N/A@@ -9371,9 +9347,8 @@
5701N/A
5701N/A if (attr)
5701N/A {
5701N/A+ attr->value_tag = IPP_TAG_KEYWORD;
5701N/A _cupsStrFree(attr->values[0].string.text);
5701N/A-
5701N/A- attr->value_tag = IPP_TAG_KEYWORD;
5701N/A attr->values[0].string.text = _cupsStrAlloc("no-hold");
5701N/A
5701N/A cupsdAddEvent(CUPSD_EVENT_JOB_CONFIG_CHANGED, cupsdFindDest(job->dest), job,
5701N/A@@ -10065,7 +10040,6 @@
5701N/A IPP_TAG_MIMETYPE)) != NULL)
5701N/A {
5701N/A _cupsStrFree(jformat->values[0].string.text);
5701N/A-
5701N/A jformat->values[0].string.text = _cupsStrAlloc(mimetype);
5701N/A }
5701N/A else
5701N/AIndex: scheduler/job.c
5701N/A===================================================================
5701N/A--- scheduler/job.c (revision 12588)
5701N/A+++ scheduler/job.c (working copy)
5701N/A@@ -397,7 +397,10 @@
5701N/A
5701N/A if ((attr = ippFindAttribute(job->attrs, "job-actual-printer-uri",
5701N/A IPP_TAG_URI)) != NULL)
5701N/A- cupsdSetString(&attr->values[0].string.text, printer->uri);
5701N/A+ {
5701N/A+ _cupsStrFree(attr->values[0].string.text);
5701N/A+ attr->values[0].string.text = _cupsStrAlloc(printer->uri);
5701N/A+ }
5701N/A else
5701N/A ippAddString(job->attrs, IPP_TAG_JOB, IPP_TAG_URI,
5701N/A "job-actual-printer-uri", NULL, printer->uri);
5701N/A@@ -1830,7 +1833,10 @@
5701N/A
5701N/A if ((attr = ippFindAttribute(job->attrs, "job-printer-uri",
5701N/A IPP_TAG_URI)) != NULL)
5701N/A- cupsdSetString(&(attr->values[0].string.text), p->uri);
5701N/A+ {
5701N/A+ _cupsStrFree(attr->values[0].string.text);
5701N/A+ attr->values[0].string.text = _cupsStrAlloc(p->uri);
5701N/A+ }
5701N/A
5701N/A cupsdAddEvent(CUPSD_EVENT_JOB_STOPPED, p, job,
5701N/A "Job #%d moved from %s to %s.", job->id, olddest,
5701N/A@@ -2026,7 +2032,10 @@
5701N/A attr = ippFindAttribute(job->attrs, "job-hold-until", IPP_TAG_NAME);
5701N/A
5701N/A if (attr)
5701N/A- cupsdSetString(&(attr->values[0].string.text), when);
5701N/A+ {
5701N/A+ _cupsStrFree(attr->values[0].string.text);
5701N/A+ attr->values[0].string.text = _cupsStrAlloc(when);
5701N/A+ }
5701N/A else
5701N/A attr = ippAddString(job->attrs, IPP_TAG_JOB, IPP_TAG_KEYWORD,
5701N/A "job-hold-until", NULL, when);
5701N/A@@ -2272,7 +2281,8 @@
5701N/A if (attr)
5701N/A {
5701N/A attr->value_tag = IPP_TAG_KEYWORD;
5701N/A- cupsdSetString(&(attr->values[0].string.text), "no-hold");
5701N/A+ _cupsStrFree(attr->values[0].string.text);
5701N/A+ attr->values[0].string.text = _cupsStrAlloc("no-hold");
5701N/A }
5701N/A
5701N/A default :
5701N/A@@ -3989,7 +3999,10 @@
5701N/A job->status_level = CUPSD_LOG_INFO;
5701N/A
5701N/A if (job->printer_message)
5701N/A- cupsdSetString(&(job->printer_message->values[0].string.text), "");
5701N/A+ {
5701N/A+ _cupsStrFree(job->printer_message->values[0].string.text);
5701N/A+ job->printer_message->values[0].string.text = _cupsStrAlloc("");
5701N/A+ }
5701N/A
5701N/A /*
5701N/A * Create the backchannel pipes and make them non-blocking...
5701N/A@@ -4547,10 +4560,15 @@
5701N/A
5701N/A if (job->state_value != IPP_JOB_PROCESSING &&
5701N/A job->status_level == CUPSD_LOG_INFO)
5701N/A- cupsdSetString(&(job->printer_message->values[0].string.text), "");
5701N/A+ {
5701N/A+ _cupsStrFree(job->printer_message->values[0].string.text);
5701N/A+ job->printer_message->values[0].string.text = _cupsStrAlloc("");
5701N/A+ }
5701N/A else if (job->printer->state_message[0] && do_message)
5701N/A- cupsdSetString(&(job->printer_message->values[0].string.text),
5701N/A- job->printer->state_message);
5701N/A+ {
5701N/A+ _cupsStrFree(job->printer_message->values[0].string.text);
5701N/A+ job->printer_message->values[0].string.text = _cupsStrAlloc(job->printer->state_message);
5701N/A+ }
5701N/A
5701N/A /*
5701N/A * ... and the printer-state-reasons value...