Use sec_initial_uid() in the places where being root doesn't matter,
[samba.git] / source3 / printing / printing_db.c
index 0e0fb1b51d694689606c7b643af0f1a25cc1086f..762b418bb1ebd4d5f18a18475b15239d3e0ab7c0 100644 (file)
@@ -7,7 +7,7 @@
    
    This program is free software; you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 2 of the License, or
+   the Free Software Foundation; either version 3 of the License, or
    (at your option) any later version.
    
    This program is distributed in the hope that it will be useful,
@@ -16,8 +16,7 @@
    GNU General Public License for more details.
    
    You should have received a copy of the GNU General Public License
-   along with this program; if not, write to the Free Software
-   Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+   along with this program.  If not, see <http://www.gnu.org/licenses/>.
 */
 
 #include "includes.h"
@@ -34,8 +33,10 @@ struct tdb_print_db *get_print_db_byname(const char *printername)
 {
        struct tdb_print_db *p = NULL, *last_entry = NULL;
        int num_open = 0;
-       pstring printdb_path;
-       BOOL done_become_root = False;
+       char *printdb_path = NULL;
+       bool done_become_root = False;
+
+       SMB_ASSERT(printername != NULL);
 
        for (p = print_db_head, last_entry = print_db_head; p; p = p->next) {
                /* Ensure the list terminates... JRA. */
@@ -53,7 +54,9 @@ struct tdb_print_db *get_print_db_byname(const char *printername)
        /* Not found. */
        if (num_open >= MAX_PRINT_DBS_OPEN) {
                /* Try and recycle the last entry. */
-               DLIST_PROMOTE(print_db_head, last_entry);
+               if (print_db_head && last_entry) {
+                       DLIST_PROMOTE(print_db_head, last_entry);
+               }
 
                for (p = print_db_head; p; p = p->next) {
                        if (p->ref_count)
@@ -70,15 +73,15 @@ struct tdb_print_db *get_print_db_byname(const char *printername)
                        memset(p->printer_name, '\0', sizeof(p->printer_name));
                        break;
                }
-               if (p) {
+               if (p && print_db_head) {
                        DLIST_PROMOTE(print_db_head, p);
                        p = print_db_head;
                }
        }
-       
+
        if (!p) {
                /* Create one. */
-               p = (struct tdb_print_db *)malloc(sizeof(struct tdb_print_db));
+               p = SMB_MALLOC_P(struct tdb_print_db);
                if (!p) {
                        DEBUG(0,("get_print_db: malloc fail !\n"));
                        return NULL;
@@ -87,16 +90,21 @@ struct tdb_print_db *get_print_db_byname(const char *printername)
                DLIST_ADD(print_db_head, p);
        }
 
-       pstrcpy(printdb_path, lock_path("printing/"));
-       pstrcat(printdb_path, printername);
-       pstrcat(printdb_path, ".tdb");
+       if (asprintf(&printdb_path, "%s%s.tdb",
+                               cache_path("printing/"),
+                               printername) < 0) {
+               DLIST_REMOVE(print_db_head, p);
+               SAFE_FREE(p);
+               return NULL;
+       }
 
-       if (geteuid() != 0) {
+       if (geteuid() != sec_initial_uid()) {
                become_root();
                done_become_root = True;
        }
 
-       p->tdb = tdb_open_log(printdb_path, 5000, TDB_DEFAULT, O_RDWR|O_CREAT, 0600);
+       p->tdb = tdb_open_log(printdb_path, 5000, TDB_DEFAULT, O_RDWR|O_CREAT, 
+               0600);
 
        if (done_become_root)
                unbecome_root();
@@ -105,9 +113,11 @@ struct tdb_print_db *get_print_db_byname(const char *printername)
                DEBUG(0,("get_print_db: Failed to open printer backend database %s.\n",
                                        printdb_path ));
                DLIST_REMOVE(print_db_head, p);
+               SAFE_FREE(printdb_path);
                SAFE_FREE(p);
                return NULL;
        }
+       SAFE_FREE(printdb_path);
        fstrcpy(p->printer_name, printername);
        p->ref_count++;
        return p;
@@ -148,7 +158,7 @@ void close_all_print_db(void)
  messages. data needs freeing on exit.
 ****************************************************************************/
 
-TDB_DATA get_printer_notify_pid_list(TDB_CONTEXT *tdb, const char *printer_name, BOOL cleanlist)
+TDB_DATA get_printer_notify_pid_list(TDB_CONTEXT *tdb, const char *printer_name, bool cleanlist)
 {
        TDB_DATA data;
        size_t i;
@@ -185,7 +195,7 @@ TDB_DATA get_printer_notify_pid_list(TDB_CONTEXT *tdb, const char *printer_name,
 
                /* Entry is dead if process doesn't exist or refcount is zero. */
 
-               while ((i < data.dsize) && ((IVAL(data.dptr, i + 4) == 0) || !process_exists(pid))) {
+               while ((i < data.dsize) && ((IVAL(data.dptr, i + 4) == 0) || !process_exists_by_pid(pid))) {
 
                        /* Refcount == zero is a logic error and should never happen. */
                        if (IVAL(data.dptr, i + 4) == 0) {