r11860: BUG 3156: don't use find_service() when explicitly looking for a printer...
authorGerald Carter <jerry@samba.org>
Tue, 22 Nov 2005 15:52:22 +0000 (15:52 +0000)
committerGerald (Jerry) Carter <jerry@samba.org>
Wed, 10 Oct 2007 16:05:31 +0000 (11:05 -0500)
(This used to be commit 46bf28c81c27dfdc412318a83bf565211a58a47d)

source3/registry/reg_printing.c
source3/rpc_server/srv_spoolss_nt.c

index b07c8e9644f56424f92901b78975f5df5e0760a6..592069052f8fc787c8a2701ef7e343522a772d12 100644 (file)
@@ -227,7 +227,16 @@ static int key_printers_fetch_keys( const char *key, REGSUBKEY_CTR *subkeys )
        
        reg_split_path( printers_key, &printername, &printerdatakey );
 
-       if ( find_service(printername) == -1
+       /* validate the printer name */
+
+       for (snum=0; snum<n_services; snum++) {
+               if ( !lp_snum_ok(snum) || !lp_print_ok(snum) )
+                       continue;
+               if (strequal( lp_servicename(snum), printername ) )
+                       break;
+       }
+
+       if ( snum>=n_services
                || !W_ERROR_IS_OK( get_a_printer(NULL, &printer, 2, printername) ) ) 
        {
                return -1;
index e5b3ca3947d59665bacac3051f8d2bef38e46b79..f0ba863b4d706676d1e6e973c67348675dba8127 100644 (file)
@@ -479,29 +479,30 @@ static BOOL set_printer_hnd_name(Printer_entry *Printer, char *handlename)
        DEBUGADD(5, ("searching for [%s]\n", aprinter ));
 
        /* Search all sharenames first as this is easier than pulling 
-          the printer_info_2 off of disk */
+          the printer_info_2 off of disk. Don't use find_service() since
+          that calls out to map_username() */
        
-       snum = find_service(aprinter);
-       
-       if ( lp_snum_ok(snum) && lp_print_ok(snum) ) {
-               found = True;
-               fstrcpy( sname, aprinter );
-       }
-
        /* do another loop to look for printernames */
        
        for (snum=0; !found && snum<n_services; snum++) {
 
-               /* no point in checking if this is not a printer or 
-                  we aren't allowing printername != sharename */
+               /* no point going on if this is not a printer */
 
-               if ( !(lp_snum_ok(snum) 
-                       && lp_print_ok(snum) 
-                       && !lp_force_printername(snum)) ) 
-               {
+               if ( !(lp_snum_ok(snum) && lp_print_ok(snum)) )
                        continue;
+
+               fstrcpy(sname, lp_servicename(snum));
+               if ( strequal( aprinter, sname ) ) {
+                       found = True;
+                       break;
                }
+
+               /* no point looking up the printer object if
+                  we aren't allowing printername != sharename */
                
+               if ( lp_force_printername(snum) )
+                       continue;
+
                fstrcpy(sname, lp_servicename(snum));
 
                printer = NULL;
@@ -524,6 +525,7 @@ static BOOL set_printer_hnd_name(Printer_entry *Printer, char *handlename)
                
                if ( strequal(printername, aprinter) ) {
                        found = True;
+                       break;
                }
                
                DEBUGADD(10, ("printername: %s\n", printername));