s3-spoolss: fix printer_driver_files_in_use() call ordering
authorDavid Disseldorp <ddiss@samba.org>
Tue, 17 Jan 2012 16:06:38 +0000 (17:06 +0100)
committerKarolin Seeger <kseeger@samba.org>
Mon, 23 Jan 2012 19:46:24 +0000 (20:46 +0100)
printer_driver_files_in_use() performs two tasks: it returns whether any
of the files in the to-be-deleted driver overlap with other drivers, it
also trims such files from the info structure passed in.

In processing a DeletePrinterDataEx request with DPD_DELETE_UNUSED_FILES
set, printer_driver_files_in_use() must be called to ensure files in
use by other drivers are not removed.

https://bugzilla.samba.org/show_bug.cgi?id=4942

source3/rpc_server/spoolss/srv_spoolss_nt.c

index 8e4ddc0414fc6ce01ac22a9ca6aea2200c451439..ea99d10a4275ad9650a3f4fe06ca2ab512dfd80d 100644 (file)
@@ -2176,16 +2176,19 @@ static WERROR spoolss_dpd_version(TALLOC_CTX *mem_ctx,
        delete_files = r->in.delete_flags
                        & (DPD_DELETE_ALL_FILES | DPD_DELETE_UNUSED_FILES);
 
-       /* fail if any files are in use and DPD_DELETE_ALL_FILES is set */
-
-       if (delete_files &&
-           (r->in.delete_flags & DPD_DELETE_ALL_FILES) &&
-           printer_driver_files_in_use(mem_ctx,
-                                       get_session_info_system(),
-                                       b,
-                                       info)) {
-               status = WERR_PRINTER_DRIVER_IN_USE;
-               goto done;
+       if (delete_files) {
+               bool in_use = printer_driver_files_in_use(mem_ctx,
+                                               get_session_info_system(),
+                                                         b,
+                                                         info);
+               if (in_use && (r->in.delete_flags & DPD_DELETE_ALL_FILES)) {
+                       status = WERR_PRINTER_DRIVER_IN_USE;
+                       goto done;
+               }
+               /*
+                * printer_driver_files_in_use() has trimmed overlapping files
+                * from info so they are not removed on DPD_DELETE_UNUSED_FILES
+                */
        }
 
        status = winreg_del_driver(mem_ctx, b, info, info->version);