diff -Naur samba-4.1.0.orig/source3/rpc_server/spoolss/srv_spoolss_nt.c samba-4.1.0/source3/rpc_server/spoolss/srv_spoolss_nt.c --- samba-4.1.0.orig/source3/rpc_server/spoolss/srv_spoolss_nt.c 2013-11-13 16:07:20.000000000 +0100 +++ samba-4.1.0/source3/rpc_server/spoolss/srv_spoolss_nt.c 2013-11-18 15:49:38.000000000 +0100 @@ -5781,7 +5781,13 @@ */ if (info_1->datatype) { - if (strcmp(info_1->datatype, "RAW") != 0) { + /* + * The v4 driver model used in Windows 8 declares print jobs + * intended to bypass the XPS processing layer by setting + * datatype to "XPS_PASS" instead of "RAW". + */ + if ((strcmp(info_1->datatype, "RAW") != 0) + && (strcmp(info_1->datatype, "XPS_PASS") != 0)) { *r->out.job_id = 0; return WERR_INVALID_DATATYPE; } diff -Naur samba-4.1.0.orig/source4/torture/rpc/spoolss.c samba-4.1.0/source4/torture/rpc/spoolss.c --- samba-4.1.0.orig/source4/torture/rpc/spoolss.c 2013-11-13 16:07:20.000000000 +0100 +++ samba-4.1.0/source4/torture/rpc/spoolss.c 2013-11-18 16:53:11.000000000 +0100 @@ -3368,11 +3368,11 @@ return true; } - -static bool test_DoPrintTest_add_one_job(struct torture_context *tctx, +static bool test_DoPrintTest_add_one_job_common(struct torture_context *tctx, struct dcerpc_binding_handle *b, struct policy_handle *handle, const char *document_name, + const char *datatype, uint32_t *job_id) { NTSTATUS status; @@ -3394,7 +3394,7 @@ info1.document_name = document_name; info1.output_file = NULL; - info1.datatype = "RAW"; + info1.datatype = datatype; info_ctr.level = 1; info_ctr.info.info1 = &info1; @@ -3443,6 +3443,25 @@ return true; } +static bool test_DoPrintTest_add_one_job(struct torture_context *tctx, + struct dcerpc_binding_handle *b, + struct policy_handle *handle, + const char *document_name, + uint32_t *job_id) +{ + test_DoPrintTest_add_one_job_common(tctx, b, handle, document_name, "RAW", job_id); +} + +static bool test_DoPrintTest_add_one_job_v4(struct torture_context *tctx, + struct dcerpc_binding_handle *b, + struct policy_handle *handle, + const char *document_name, + uint32_t *job_id) +{ + test_DoPrintTest_add_one_job_common(tctx, b, handle, document_name, "XPS_PASS", job_id); +} + + static bool test_DoPrintTest_check_jobs(struct torture_context *tctx, struct dcerpc_binding_handle *b, struct policy_handle *handle, @@ -3542,6 +3561,14 @@ } for (i=0; i < num_jobs; i++) { + ret &= test_SetJob(tctx, b, handle, job_ids[i], NULL, SPOOLSS_JOB_CONTROL_DELETE); + } + + for (i=0; i < num_jobs; i++) { + ret &= test_DoPrintTest_add_one_job_v4(tctx, b, handle, "TorturePrintJob v4", &job_ids[i]); + } + + for (i=0; i < num_jobs; i++) { ret &= test_SetJob(tctx, b, handle, job_ids[i], NULL, SPOOLSS_JOB_CONTROL_DELETE); }