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