From 343cfc45281999a9ac7977379ad3652bac3232d9 Mon Sep 17 00:00:00 2001 From: David Disseldorp Date: Thu, 9 Jun 2011 16:55:19 +0200 Subject: [PATCH] s3-printing: fix internal printing tdb upgrade move_driver_file_to_download_area() then assumes that files corresponding to the AddPrinterDriver request being handled are staged in the $architecture subdirectory of the print$ share path. This is where clients upload printer driver files prior to them being moved by the server into the $architecture\$version directory. This assumption is incorrect when an AddPrinterDriver is issued to upgrade internal printing tdbs to the new registry format. This fix adds a new internal add printer driver flag to skip manipulation of printer driver files in this case. https://bugzilla.samba.org/show_bug.cgi?id=8214 --- librpc/idl/spoolss.idl | 3 ++- source3/printing/nt_printing_migrate.c | 11 ++++++----- source3/rpc_server/spoolss/srv_spoolss_nt.c | 22 +++++++++++++--------- 3 files changed, 21 insertions(+), 15 deletions(-) diff --git a/librpc/idl/spoolss.idl b/librpc/idl/spoolss.idl index 4599e3a..e3b2743 100644 --- a/librpc/idl/spoolss.idl +++ b/librpc/idl/spoolss.idl @@ -3074,7 +3074,8 @@ cpp_quote("#define spoolss_security_descriptor security_descriptor") APD_COPY_FROM_DIRECTORY = 0x00000010, APD_DONT_COPY_FILES_TO_CLUSTER = 0x00001000, APD_COPY_TO_ALL_SPOOLERS = 0x00002000, - APD_RETURN_BLOCKING_STATUS_CODE = 0x00010000 + APD_RETURN_BLOCKING_STATUS_CODE = 0x00010000, + APD_SKIP_FILES = 0x80000000 /* internal */ } spoolss_AddPrinterDriverExFlags; [public] WERROR spoolss_AddPrinterDriverEx( diff --git a/source3/printing/nt_printing_migrate.c b/source3/printing/nt_printing_migrate.c index f56fa9a..4d01671 100644 --- a/source3/printing/nt_printing_migrate.c +++ b/source3/printing/nt_printing_migrate.c @@ -188,11 +188,12 @@ static NTSTATUS migrate_driver(TALLOC_CTX *mem_ctx, d.level = 3; d.info.info3 = &d3; - status = dcerpc_spoolss_AddPrinterDriver(b, - mem_ctx, - srv_name_slash, - &d, - &result); + status = dcerpc_spoolss_AddPrinterDriverEx(b, + mem_ctx, + srv_name_slash, + &d, + APD_SKIP_FILES, + &result); if (!NT_STATUS_IS_OK(status)) { DEBUG(2, ("dcerpc_spoolss_AddPrinterDriver(%s) refused -- %s.\n", d3.driver_name, nt_errstr(status))); diff --git a/source3/rpc_server/spoolss/srv_spoolss_nt.c b/source3/rpc_server/spoolss/srv_spoolss_nt.c index 7980072..67f4f44 100644 --- a/source3/rpc_server/spoolss/srv_spoolss_nt.c +++ b/source3/rpc_server/spoolss/srv_spoolss_nt.c @@ -8023,13 +8023,15 @@ WERROR _spoolss_AddPrinterDriverEx(struct pipes_struct *p, /* * we only support the semantics of AddPrinterDriver() * i.e. only copy files that are newer than existing ones + * APD_SKIP_FILES is used internally to modify driver meta-data only */ if (r->in.flags == 0) { return WERR_INVALID_PARAM; } - if (r->in.flags != APD_COPY_NEW_FILES) { + if ((r->in.flags != APD_COPY_NEW_FILES) + && (r->in.flags != APD_SKIP_FILES)) { return WERR_ACCESS_DENIED; } @@ -8043,15 +8045,17 @@ WERROR _spoolss_AddPrinterDriverEx(struct pipes_struct *p, return WERR_UNKNOWN_LEVEL; } - DEBUG(5,("Cleaning driver's information\n")); - err = clean_up_driver_struct(p->mem_ctx, p->session_info, r->in.info_ctr); - if (!W_ERROR_IS_OK(err)) - goto done; + if (r->in.flags != APD_SKIP_FILES) { + DEBUG(5,("Cleaning driver's information\n")); + err = clean_up_driver_struct(p->mem_ctx, p->session_info, r->in.info_ctr); + if (!W_ERROR_IS_OK(err)) + goto done; - DEBUG(5,("Moving driver to final destination\n")); - err = move_driver_to_download_area(p->session_info, r->in.info_ctr); - if (!W_ERROR_IS_OK(err)) { - goto done; + DEBUG(5,("Moving driver to final destination\n")); + err = move_driver_to_download_area(p->session_info, r->in.info_ctr); + if (!W_ERROR_IS_OK(err)) { + goto done; + } } err = winreg_add_driver(p->mem_ctx, -- 1.7.1