nt_printing: don't leak state_path onto talloc tos
authorDavid Disseldorp <ddiss@samba.org>
Sun, 2 Nov 2014 19:21:29 +0000 (20:21 +0100)
committerJeremy Allison <jra@samba.org>
Mon, 3 Nov 2014 22:46:04 +0000 (23:46 +0100)
Also check for allocation failures, and close tdbs in
nt_printing_tdb_upgrade error paths.

Signed-off-by: David Disseldorp <ddiss@samba.org>
Reviewed-by: Jeremy Allison <jra@samba.org>
source3/printing/nt_printing_migrate_internal.c
source3/printing/nt_printing_tdb.c

index 6bc7ea2e8ecb8792a538c2a5518c023cfd9fc99b..bbcce8e4e8ac31c0e5c76114f3f937855e81d57d 100644 (file)
@@ -186,17 +186,30 @@ static NTSTATUS migrate_internal(TALLOC_CTX *mem_ctx,
 
 bool nt_printing_tdb_migrate(struct messaging_context *msg_ctx)
 {
-       const char *drivers_path = state_path("ntdrivers.tdb");
-       const char *printers_path = state_path("ntprinters.tdb");
-       const char *forms_path = state_path("ntforms.tdb");
-       bool drivers_exists = file_exist(drivers_path);
-       bool printers_exists = file_exist(printers_path);
-       bool forms_exists = file_exist(forms_path);
+       const char *drivers_path;
+       const char *printers_path;
+       const char *forms_path;
+       bool drivers_exists;
+       bool printers_exists;
+       bool forms_exists;
        struct auth_session_info *session_info;
        struct rpc_pipe_client *winreg_pipe = NULL;
        TALLOC_CTX *tmp_ctx = talloc_stackframe();
        NTSTATUS status;
 
+       /* paths talloced on new stackframe */
+       drivers_path = state_path("ntdrivers.tdb");
+       printers_path = state_path("ntprinters.tdb");
+       forms_path = state_path("ntforms.tdb");
+       if ((drivers_path == NULL) || (printers_path == NULL)
+                                               || (forms_path == NULL)) {
+               talloc_free(tmp_ctx);
+               return false;
+       }
+       drivers_exists = file_exist(drivers_path);
+       printers_exists = file_exist(printers_path);
+       forms_exists = file_exist(forms_path);
+
        if (!drivers_exists && !printers_exists && !forms_exists) {
                talloc_free(tmp_ctx);
                return true;
index 870231af8c026003febd00d1b93a79a6d9bf50b6..953448d497ee54ee1a8a9a5bc308a11f47a0da2f 100644 (file)
@@ -339,17 +339,39 @@ static bool upgrade_to_version_5(void)
 
 bool nt_printing_tdb_upgrade(void)
 {
-       const char *drivers_path = state_path("ntdrivers.tdb");
-       const char *printers_path = state_path("ntprinters.tdb");
-       const char *forms_path = state_path("ntforms.tdb");
-       bool drivers_exists = file_exist(drivers_path);
-       bool printers_exists = file_exist(printers_path);
-       bool forms_exists = file_exist(forms_path);
+       char *drivers_path;
+       char *printers_path;
+       char *forms_path;
+       bool drivers_exists;
+       bool printers_exists;
+       bool forms_exists;
        const char *vstring = "INFO/version";
        int32_t vers_id;
+       bool ret;
+
+       drivers_path = state_path("ntdrivers.tdb");
+       if (drivers_path == NULL) {
+               ret = false;
+               goto err_out;
+       }
+       printers_path = state_path("ntprinters.tdb");
+       if (printers_path == NULL) {
+               ret = false;
+               goto err_drvdb_free;
+       }
+       forms_path = state_path("ntforms.tdb");
+       if (forms_path == NULL) {
+               ret = false;
+               goto err_prdb_free;
+       }
+
+       drivers_exists = file_exist(drivers_path);
+       printers_exists = file_exist(printers_path);
+       forms_exists = file_exist(forms_path);
 
        if (!drivers_exists && !printers_exists && !forms_exists) {
-               return true;
+               ret = true;
+               goto err_formsdb_free;
        }
 
        tdb_drivers = tdb_open_log(drivers_path,
@@ -361,7 +383,8 @@ bool nt_printing_tdb_upgrade(void)
                DEBUG(0,("nt_printing_init: Failed to open nt drivers "
                         "database %s (%s)\n",
                         drivers_path, strerror(errno)));
-               return false;
+               ret = false;
+               goto err_formsdb_free;
        }
 
        tdb_printers = tdb_open_log(printers_path,
@@ -373,7 +396,8 @@ bool nt_printing_tdb_upgrade(void)
                DEBUG(0,("nt_printing_init: Failed to open nt printers "
                         "database %s (%s)\n",
                         printers_path, strerror(errno)));
-               return false;
+               ret = false;
+               goto err_drvdb_close;
        }
 
        tdb_forms = tdb_open_log(forms_path,
@@ -385,7 +409,8 @@ bool nt_printing_tdb_upgrade(void)
                DEBUG(0,("nt_printing_init: Failed to open nt forms "
                         "database %s (%s)\n",
                         forms_path, strerror(errno)));
-               return false;
+               ret = false;
+               goto err_prdb_close;
        }
 
        /* Samba upgrade */
@@ -400,7 +425,8 @@ bool nt_printing_tdb_upgrade(void)
                if ((vers_id == NTDRIVERS_DATABASE_VERSION_1) ||
                    (IREV(vers_id) == NTDRIVERS_DATABASE_VERSION_1)) {
                        if (!upgrade_to_version_3()) {
-                               return false;
+                               ret = false;
+                               goto err_formsdb_close;
                        }
 
                        tdb_store_int32(tdb_drivers, vstring, NTDRIVERS_DATABASE_VERSION_3);
@@ -420,7 +446,8 @@ bool nt_printing_tdb_upgrade(void)
 
                if (vers_id == NTDRIVERS_DATABASE_VERSION_3) {
                        if (!upgrade_to_version_4()) {
-                               return false;
+                               ret = false;
+                               goto err_formsdb_close;
                        }
                        tdb_store_int32(tdb_drivers, vstring, NTDRIVERS_DATABASE_VERSION_4);
                        vers_id = NTDRIVERS_DATABASE_VERSION_4;
@@ -428,7 +455,8 @@ bool nt_printing_tdb_upgrade(void)
 
                if (vers_id == NTDRIVERS_DATABASE_VERSION_4 ) {
                        if (!upgrade_to_version_5()) {
-                               return false;
+                               ret = false;
+                               goto err_formsdb_close;
                        }
                        tdb_store_int32(tdb_drivers, vstring, NTDRIVERS_DATABASE_VERSION_5);
                        vers_id = NTDRIVERS_DATABASE_VERSION_5;
@@ -436,24 +464,33 @@ bool nt_printing_tdb_upgrade(void)
 
                if (vers_id != NTDRIVERS_DATABASE_VERSION_5) {
                        DEBUG(0,("nt_printing_init: Unknown printer database version [%d]\n", vers_id));
-                       return false;
+                       ret = false;
+                       goto err_formsdb_close;
                }
        }
+       ret = true;
 
-       if (tdb_drivers) {
-               tdb_close(tdb_drivers);
-               tdb_drivers = NULL;
+err_formsdb_close:
+       if (tdb_forms) {
+               tdb_close(tdb_forms);
+               tdb_forms = NULL;
        }
-
+err_prdb_close:
        if (tdb_printers) {
                tdb_close(tdb_printers);
                tdb_printers = NULL;
        }
-
-       if (tdb_forms) {
-               tdb_close(tdb_forms);
-               tdb_forms = NULL;
+err_drvdb_close:
+       if (tdb_drivers) {
+               tdb_close(tdb_drivers);
+               tdb_drivers = NULL;
        }
-
-       return true;
+err_formsdb_free:
+       talloc_free(forms_path);
+err_prdb_free:
+       talloc_free(printers_path);
+err_drvdb_free:
+       talloc_free(drivers_path);
+err_out:
+       return ret;
 }