Fixed up error checking and move printer file code. Fixed a memory leak.
authorJeremy Allison <jra@samba.org>
Tue, 25 Jul 2000 22:35:57 +0000 (22:35 +0000)
committerJeremy Allison <jra@samba.org>
Tue, 25 Jul 2000 22:35:57 +0000 (22:35 +0000)
Jeremy.
(This used to be commit 5130dd0f8b80aed5fb3c0df290b627057cc9b825)

source3/printing/nt_printing.c
source3/rpc_server/srv_spoolss_nt.c
source3/smbd/lanman.c

index 9661c9265fe3aac1916b5a7cfb4cc40c81b8070f..77f2ec47dae2ebe65b05ee60021703f9d161daf3 100644 (file)
@@ -1,3 +1,4 @@
+#define OLD_NTDOMAIN 1
 /* 
  *  Unix SMB/Netbios implementation.
  *  Version 1.9.
@@ -391,6 +392,7 @@ BOOL move_driver_to_download_area(NT_PRINTER_DRIVER_INFO_LEVEL driver_abstract,
        pstring old_name;
        pstring new_name;
        fstring user_name;
+       fstring null_pw;
        connection_struct *conn;
        pstring inbuf;
        pstring outbuf;
@@ -410,16 +412,30 @@ BOOL move_driver_to_download_area(NT_PRINTER_DRIVER_INFO_LEVEL driver_abstract,
        
        /* connect to the print$ share under the same account as the user connected to the rpc pipe */  
        fstrcpy(user_name, uidtoname(user->uid));
-       if((smb_pass = getsmbpwnam(user_name)) == NULL) {
+       DEBUG(10,("move_driver_to_download_area: uid %d -> user %s\n", (int)user->uid, user_name));
+
+       become_root();
+       smb_pass = getsmbpwnam(user_name);
+       if(smb_pass == NULL) {
                DEBUG(0,("move_driver_to_download_area: Unable to get smbpasswd entry for user %s\n",
                                user_name ));
+               unbecome_root();
                return False;
        }
 
-       conn = make_connection("print$", uidtoname(user->uid), smb_pass->smb_nt_passwd, 24, "A:", user->vuid, &ecode);
+       /* Null password is ok - we are already an authenticated user... */
+       *null_pw = '\0';
+       conn = make_connection("print$", user_name, null_pw, 0, "A:", user->vuid, &ecode);
 
        if (conn == NULL) {
                DEBUG(0,("move_driver_to_download_area: Unable to connect\n"));
+               unbecome_root();
+               return False;
+       }
+
+       if (!become_user(conn, conn->vuid)) {
+               DEBUG(0,("move_driver_to_download_area: Can't become user %s\n", user_name ));
+               unbecome_root();
                return False;
        }
 
@@ -445,6 +461,8 @@ BOOL move_driver_to_download_area(NT_PRINTER_DRIVER_INFO_LEVEL driver_abstract,
        if ((outsize = rename_internals(conn, inbuf, outbuf, old_name, new_name, False)) != 0) {
                DEBUG(0,("move_driver_to_download_area: Unable to rename %s to %s\n",
                                old_name, new_name ));
+               close_cnum(conn, user->vuid);
+               unbecome_root();
                return False;
        }
 
@@ -453,6 +471,8 @@ BOOL move_driver_to_download_area(NT_PRINTER_DRIVER_INFO_LEVEL driver_abstract,
        if ((outsize = rename_internals(conn, inbuf, outbuf, old_name, new_name, False)) != 0) {
                DEBUG(0,("move_driver_to_download_area: Unable to rename %s to %s\n",
                                old_name, new_name ));
+               close_cnum(conn, user->vuid);
+               unbecome_root();
                return False;
        }
 
@@ -461,6 +481,8 @@ BOOL move_driver_to_download_area(NT_PRINTER_DRIVER_INFO_LEVEL driver_abstract,
        if ((outsize = rename_internals(conn, inbuf, outbuf, old_name, new_name, False)) != 0) {
                DEBUG(0,("move_driver_to_download_area: Unable to rename %s to %s\n",
                        old_name, new_name ));
+               close_cnum(conn, user->vuid);
+               unbecome_root();
                return False;
        }
 
@@ -469,6 +491,8 @@ BOOL move_driver_to_download_area(NT_PRINTER_DRIVER_INFO_LEVEL driver_abstract,
        if ((outsize = rename_internals(conn, inbuf, outbuf, old_name, new_name, False)) != 0) {
                DEBUG(0,("move_driver_to_download_area: Unable to rename %s to %s\n",
                        old_name, new_name ));
+               close_cnum(conn, user->vuid);
+               unbecome_root();
                return False;
        }
 
@@ -476,15 +500,16 @@ BOOL move_driver_to_download_area(NT_PRINTER_DRIVER_INFO_LEVEL driver_abstract,
                for (i=0; *driver->dependentfiles[i]; i++) {
                        slprintf(old_name, sizeof(old_name), "%s\\%s", architecture, driver->dependentfiles[i]);        
                        slprintf(new_name, sizeof(new_name), "%s\\%s", new_dir, driver->dependentfiles[i]);     
-                       if ((outsize = rename_internals(conn, inbuf, outbuf, old_name, new_name, False)) != 0) {
-                               DEBUG(0,("move_driver_to_download_area: Unable to rename %s to %s\n",
-                                       old_name, new_name ));
-                               return False;
-                       }
+                       /*
+                        * We don't check the error returns here as several of these
+                        * files may have already been moved in the list above...
+                        */
+                       rename_internals(conn, inbuf, outbuf, old_name, new_name, False);
                }
        }
 
        close_cnum(conn, user->vuid);
+       unbecome_root();
 
        return True;
 }
@@ -699,7 +724,7 @@ static uint32 get_a_printer_driver_3(NT_PRINTER_DRIVER_INFO_LEVEL_3 **info_ptr,
 uint32 get_a_printer_driver_9x_compatible(pstring line, fstring model)
 {
        NT_PRINTER_DRIVER_INFO_LEVEL_3 *info3;
-       TDB_DATA kbuf, dbuf;
+       TDB_DATA kbuf;
        pstring key;
        int i;
        line[0] = '\0';
index 53df5dfee4ce207296a08592cc6e69c620c315ea..30131482ac76c392ee22d0239033967be56c9e8e 100644 (file)
@@ -2648,8 +2648,10 @@ uint32 status=0;
 
        status=get_a_printer_driver(&driver, 3, printer->info_2->drivername, architecture, version);    
        DEBUG(8,("construct_printer_driver_info_3: status: %d\n", status));
-       if (status != 0)
+       if (status != 0) {
+               free_a_printer(&printer,2);
                return ERROR_UNKNOWN_PRINTER_DRIVER;
+       }
 
        fill_printer_driver_info_3(info, driver, servername);
 
@@ -3764,7 +3766,6 @@ uint32 _spoolss_enumprinterdrivers( UNISTR2 *name, UNISTR2 *environment, uint32
                                    NEW_BUFFER *buffer, uint32 offered,
                                    uint32 *needed, uint32 *returned)
 {
-       int i;
        fstring *list = NULL;
        fstring servername;
        fstring architecture;
index 078e3385dc7d3258ed70ae228966450d2c57956c..6cb63f18f77c2d2aad9b025a58e8610a2e081d49 100644 (file)
@@ -508,7 +508,7 @@ static void fill_printq_info_52(connection_struct *conn, int snum, int uLevel,
         * the existing fileset. JRA.
         */
 
-       if ( ok = get_a_printer_driver_9x_compatible(gen_line, lp_printerdriver(snum)) ) {
+       if ((ok = get_a_printer_driver_9x_compatible(gen_line, lp_printerdriver(snum)) ) == True) {
         p = gen_line;
                DEBUG(10,("9x compatable driver line for [%s]: [%s]\n", lp_printerdriver(snum), gen_line));
     } else {
@@ -725,7 +725,7 @@ static int get_printerdrivernumber(int snum)
 
        if( !ok ) {
                /* no printers.def, or driver not found, check the NT driver tdb */
-               if ( ok = get_a_printer_driver_9x_compatible(gen_line, lp_printerdriver(snum)) ) {
+               if ((ok = get_a_printer_driver_9x_compatible(gen_line, lp_printerdriver(snum)))==True ) {
                p = gen_line;
                        DEBUG(10,("9x compatable driver line for [%s]: [%s]\n",
                                          lp_printerdriver(snum), gen_line));