119 lines
3.9 KiB
Diff
119 lines
3.9 KiB
Diff
diff -up cups-1.5.4/scheduler/ipp.c.str4072 cups-1.5.4/scheduler/ipp.c
|
|
--- cups-1.5.4/scheduler/ipp.c.str4072 2012-09-21 16:12:17.804952422 +0200
|
|
+++ cups-1.5.4/scheduler/ipp.c 2012-09-21 16:13:15.032165941 +0200
|
|
@@ -12131,7 +12131,8 @@ validate_job(cupsd_client_t *con, /* I
|
|
http_status_t status; /* Policy status */
|
|
ipp_attribute_t *attr, /* Current attribute */
|
|
*auth_info; /* auth-info attribute */
|
|
- ipp_attribute_t *format; /* Document-format attribute */
|
|
+ ipp_attribute_t *format, /* Document-format attribute */
|
|
+ *name; /* Job-name attribute */
|
|
cups_ptype_t dtype; /* Destination type (printer/class) */
|
|
char super[MIME_MAX_SUPER],
|
|
/* Supertype of file */
|
|
@@ -12158,7 +12159,7 @@ validate_job(cupsd_client_t *con, /* I
|
|
)
|
|
{
|
|
send_ipp_status(con, IPP_ATTRIBUTES,
|
|
- _("Unsupported compression \"%s\"."),
|
|
+ _("Unsupported 'compression' value \"%s\"."),
|
|
attr->values[0].string.text);
|
|
ippAddString(con->response, IPP_TAG_UNSUPPORTED_GROUP, IPP_TAG_KEYWORD,
|
|
"compression", NULL, attr->values[0].string.text);
|
|
@@ -12176,7 +12177,8 @@ validate_job(cupsd_client_t *con, /* I
|
|
if (sscanf(format->values[0].string.text, "%15[^/]/%31[^;]",
|
|
super, type) != 2)
|
|
{
|
|
- send_ipp_status(con, IPP_BAD_REQUEST, _("Bad document-format \"%s\"."),
|
|
+ send_ipp_status(con, IPP_BAD_REQUEST,
|
|
+ _("Bad 'document-format' value \"%s\"."),
|
|
format->values[0].string.text);
|
|
return;
|
|
}
|
|
@@ -12187,7 +12189,7 @@ validate_job(cupsd_client_t *con, /* I
|
|
cupsdLogMessage(CUPSD_LOG_INFO,
|
|
"Hint: Do you have the raw file printing rules enabled?");
|
|
send_ipp_status(con, IPP_DOCUMENT_FORMAT,
|
|
- _("Unsupported document-format \"%s\"."),
|
|
+ _("Unsupported 'document-format' value \"%s\"."),
|
|
format->values[0].string.text);
|
|
ippAddString(con->response, IPP_TAG_UNSUPPORTED_GROUP, IPP_TAG_MIMETYPE,
|
|
"document-format", NULL, format->values[0].string.text);
|
|
@@ -12195,6 +12197,76 @@ validate_job(cupsd_client_t *con, /* I
|
|
}
|
|
}
|
|
|
|
+ /*
|
|
+ * Is the job-name valid?
|
|
+ */
|
|
+
|
|
+ if ((name = ippFindAttribute(con->request, "job-name", IPP_TAG_ZERO)) != NULL)
|
|
+ {
|
|
+ int bad_name = 0; /* Is the job-name value bad? */
|
|
+
|
|
+ if ((name->value_tag != IPP_TAG_NAME && name->value_tag != IPP_TAG_NAMELANG) ||
|
|
+ name->num_values != 1)
|
|
+ {
|
|
+ bad_name = 1;
|
|
+ }
|
|
+ else
|
|
+ {
|
|
+ /*
|
|
+ * Validate that job-name conforms to RFC 5198 (Network Unicode) and
|
|
+ * IPP Everywhere requirements for "name" values...
|
|
+ */
|
|
+
|
|
+ const unsigned char *nameptr; /* Pointer into "job-name" attribute */
|
|
+
|
|
+ for (nameptr = (unsigned char *)name->values[0].string.text;
|
|
+ *nameptr;
|
|
+ nameptr ++)
|
|
+ {
|
|
+ if (*nameptr < ' ' && *nameptr != '\t')
|
|
+ break;
|
|
+ else if (*nameptr == 0x7f)
|
|
+ break;
|
|
+ else if ((*nameptr & 0xe0) == 0xc0)
|
|
+ {
|
|
+ if ((nameptr[1] & 0xc0) != 0x80)
|
|
+ break;
|
|
+
|
|
+ nameptr ++;
|
|
+ }
|
|
+ else if ((*nameptr & 0xf0) == 0xe0)
|
|
+ {
|
|
+ if ((nameptr[1] & 0xc0) != 0x80 ||
|
|
+ (nameptr[2] & 0xc0) != 0x80)
|
|
+ break;
|
|
+
|
|
+ nameptr += 2;
|
|
+ }
|
|
+ else if ((*nameptr & 0xf8) == 0xf0)
|
|
+ {
|
|
+ if ((nameptr[1] & 0xc0) != 0x80 ||
|
|
+ (nameptr[2] & 0xc0) != 0x80 ||
|
|
+ (nameptr[3] & 0xc0) != 0x80)
|
|
+ break;
|
|
+
|
|
+ nameptr += 3;
|
|
+ }
|
|
+ else if (*nameptr & 0x80)
|
|
+ break;
|
|
+ }
|
|
+
|
|
+ if (*nameptr)
|
|
+ bad_name = 1;
|
|
+ }
|
|
+
|
|
+ if (bad_name)
|
|
+ {
|
|
+ cupsdLogMessage(CUPSD_LOG_WARN,
|
|
+ "Unsupported 'job-name' value, deleting from request.");
|
|
+ ippDeleteAttribute(con->request, name);
|
|
+ }
|
|
+ }
|
|
+
|
|
/*
|
|
* Is the destination valid?
|
|
*/
|