On 09/10/2009 04:42 PM, Simo Sorce wrote:
> On Thu, 2009-09-10 at 16:18 -0400, Stephen Gallagher wrote:
>>> mem_ctx is not used anymore in this function as far as I can see,
>>> please remove it.
>>
>> It is still used for sysdb_init, so I left it there.
> 
> That sysdb_init() is used only to make sure the db is properly
> initialized but the results are then discarded, we should probably
> change the code to create a tmp_ctx right before running sysdb_init()
> and then talloc_zfree(tmp_ctx) instead of the db_list.
> This would also cause the mem_ctx to not be necessary anymore.
> 
> Simo.
> 

Created a tmp_ctx around the sysdb_init and removed the mem_ctx from the
function. Also noticed a place where I forgot to remove a talloc_free(ctx).

-- 
Stephen Gallagher
RHCE 804006346421761

Looking to carve out IT costs?
www.redhat.com/carveoutcosts/
From 9be62d9088f558a95b39a6d9ba63dcf47dfec906 Mon Sep 17 00:00:00 2001
From: Stephen Gallagher <sgall...@redhat.com>
Date: Thu, 10 Sep 2009 09:26:28 -0400
Subject: [PATCH 3/4] Remove unused event context argument from confdb_init

Because the confdb always operates synchronously, it maintains its
own private event context internally. The event context argument
passed to it is never used, so we'll remove it to avoid confusion.
---
 server/confdb/confdb.c     |    1 -
 server/confdb/confdb.h     |    1 -
 server/monitor/monitor.c   |    2 +-
 server/tests/sysdb-tests.c |    2 +-
 server/tools/tools_util.c  |    2 +-
 server/util/server.c       |    4 ++--
 6 files changed, 5 insertions(+), 7 deletions(-)

diff --git a/server/confdb/confdb.c b/server/confdb/confdb.c
index 27daee8..5d7bb65 100644
--- a/server/confdb/confdb.c
+++ b/server/confdb/confdb.c
@@ -627,7 +627,6 @@ done:
 }
 
 int confdb_init(TALLOC_CTX *mem_ctx,
-                struct tevent_context *ev,
                 struct confdb_ctx **cdb_ctx,
                 char *confdb_location)
 {
diff --git a/server/confdb/confdb.h b/server/confdb/confdb.h
index d325ac8..d49040f 100644
--- a/server/confdb/confdb.h
+++ b/server/confdb/confdb.h
@@ -86,7 +86,6 @@ int confdb_get_string_as_list(struct confdb_ctx *cdb, 
TALLOC_CTX *ctx,
                               char ***result);
 
 int confdb_init(TALLOC_CTX *mem_ctx,
-                struct tevent_context *ev,
                 struct confdb_ctx **cdb_ctx,
                 char *confdb_location);
 
diff --git a/server/monitor/monitor.c b/server/monitor/monitor.c
index 86b2364..cd4e3ce 100644
--- a/server/monitor/monitor.c
+++ b/server/monitor/monitor.c
@@ -1811,7 +1811,7 @@ int monitor_process_init(TALLOC_CTX *mem_ctx,
         }
 
         unlink(cdb_file);
-        ret = confdb_init(ctx, ctx->ev, &ctx->cdb, cdb_file);
+        ret = confdb_init(ctx, &ctx->cdb, cdb_file);
         if (ret != EOK) {
             DEBUG(0,("The confdb initialization failed\n"));
             talloc_free(ctx);
diff --git a/server/tests/sysdb-tests.c b/server/tests/sysdb-tests.c
index 38bfcb1..5250b08 100644
--- a/server/tests/sysdb-tests.c
+++ b/server/tests/sysdb-tests.c
@@ -81,7 +81,7 @@ static int setup_sysdb_tests(struct sysdb_test_ctx **ctx)
     DEBUG(3, ("CONFDB: %s\n", conf_db));
 
     /* Connect to the conf db */
-    ret = confdb_init(test_ctx, test_ctx->ev, &test_ctx->confdb, conf_db);
+    ret = confdb_init(test_ctx, &test_ctx->confdb, conf_db);
     if (ret != EOK) {
         fail("Could not initialize connection to the confdb");
         talloc_free(test_ctx);
diff --git a/server/tools/tools_util.c b/server/tools/tools_util.c
index c23899c..15ba16f 100644
--- a/server/tools/tools_util.c
+++ b/server/tools/tools_util.c
@@ -76,7 +76,7 @@ int setup_db(struct tools_ctx **tools_ctx)
     }
 
     /* Connect to the conf db */
-    ret = confdb_init(ctx, ctx->ev, &ctx->confdb, confdb_path);
+    ret = confdb_init(ctx, &ctx->confdb, confdb_path);
     if (ret != EOK) {
         DEBUG(1, ("Could not initialize connection to the confdb\n"));
         talloc_free(ctx);
diff --git a/server/util/server.c b/server/util/server.c
index d20a823..0760e60 100644
--- a/server/util/server.c
+++ b/server/util/server.c
@@ -47,7 +47,7 @@ static void close_low_fds(bool stderr_too)
        int i;
 
        close(0);
-       close(1); 
+       close(1);
 
        if (stderr_too)
                close(2);
@@ -354,7 +354,7 @@ int server_setup(const char *name, int flags,
     }
     DEBUG(3, ("CONFDB: %s\n", conf_db));
 
-    ret = confdb_init(ctx, event_ctx, &ctx->confdb_ctx, conf_db);
+    ret = confdb_init(ctx, &ctx->confdb_ctx, conf_db);
     if (ret != EOK) {
         DEBUG(0,("The confdb initialization failed\n"));
         return ret;
-- 
1.6.2.5

From fc18af4ec7f4832f357950c3bee738832b9425d8 Mon Sep 17 00:00:00 2001
From: Stephen Gallagher <sgall...@redhat.com>
Date: Thu, 10 Sep 2009 10:22:50 -0400
Subject: [PATCH 4/4] Read the configuration parsing before daemonization

We will now parse the config file and validate the confdb contents
before processing the rest of the monitor startup. This will allow
us to return an appropriate error code to the shell if the
configuration is invalid.
---
 server/monitor/monitor.c |  183 ++++++++++++++++++++++++++--------------------
 server/monitor/monitor.h |    6 +-
 2 files changed, 106 insertions(+), 83 deletions(-)

diff --git a/server/monitor/monitor.c b/server/monitor/monitor.c
index cd4e3ce..6cf077d 100644
--- a/server/monitor/monitor.c
+++ b/server/monitor/monitor.c
@@ -1385,6 +1385,86 @@ int read_config_file(const char *config_file)
     return ret;
 }
 
+static errno_t load_configuration(TALLOC_CTX *mem_ctx,
+                                  const char *config_file,
+                                  struct mt_ctx **monitor)
+{
+    errno_t ret;
+    struct mt_ctx *ctx;
+    char *cdb_file = NULL;
+
+    ctx = talloc_zero(mem_ctx, struct mt_ctx);
+    if(!ctx) {
+        return ENOMEM;
+    }
+
+    cdb_file = talloc_asprintf(ctx, "%s/%s", DB_PATH, CONFDB_FILE);
+    if (cdb_file == NULL) {
+        DEBUG(0,("Out of memory, aborting!\n"));
+        ret = ENOMEM;
+        goto done;
+    }
+
+    ret = confdb_init(ctx, &ctx->cdb, cdb_file);
+    if (ret != EOK) {
+        DEBUG(0,("The confdb initialization failed\n"));
+        goto done;
+    }
+    talloc_free(cdb_file);
+
+    /* Initialize the CDB from the configuration file */
+    ret = confdb_test(ctx->cdb);
+    if (ret == ENOENT) {
+        /* First-time setup */
+
+        /* Purge any existing confdb in case an old
+         * misconfiguration gets in the way
+         */
+        talloc_zfree(ctx->cdb);
+        unlink(cdb_file);
+
+        ret = confdb_init(ctx, &ctx->cdb, cdb_file);
+        if (ret != EOK) {
+            DEBUG(0,("The confdb initialization failed\n"));
+            goto done;
+        }
+
+        /* Load special entries */
+        ret = confdb_create_base(ctx->cdb);
+        if (ret != EOK) {
+            DEBUG(0, ("Unable to load special entries into confdb\n"));
+            goto done;
+        }
+    } else if (ret != EOK) {
+        DEBUG(0, ("Fatal error initializing confdb\n"));
+        goto done;
+    }
+
+    ret = confdb_init_db(config_file, ctx->cdb);
+    if (ret != EOK) {
+        DEBUG(0, ("ConfDB initialization has failed [%s]\n",
+              strerror(ret)));
+        goto done;
+    }
+
+    /* Validate the configuration in the database */
+    /* Read in the monitor's configuration */
+    ret = get_monitor_config(ctx);
+    if (ret != EOK) {
+        goto done;
+    }
+
+    *monitor = ctx;
+
+    ret = EOK;
+
+done:
+    if (ret != EOK) {
+        talloc_free(ctx);
+    }
+    return ret;
+}
+
 #ifdef HAVE_SYS_INOTIFY_H
 static void process_config_file(struct tevent_context *ev,
                                 struct tevent_timer *te,
@@ -1774,81 +1854,18 @@ static int monitor_config_file(TALLOC_CTX *mem_ctx,
     return EOK;
 }
 
-int monitor_process_init(TALLOC_CTX *mem_ctx,
-                         struct tevent_context *event_ctx,
-                         struct confdb_ctx *cdb,
+int monitor_process_init(struct mt_ctx *ctx,
                          const char *config_file)
 {
-    struct mt_ctx *ctx;
+    TALLOC_CTX *tmp_ctx;
     struct sysdb_ctx_list *db_list;
     struct tevent_signal *tes;
     int ret, i;
-    char *cdb_file;
     struct sss_domain_info *dom;
 
-    ctx = talloc_zero(mem_ctx, struct mt_ctx);
-    if (!ctx) {
-        DEBUG(0, ("fatal error initializing monitor!\n"));
-        return ENOMEM;
-    }
-    ctx->ev = event_ctx;
-    ctx->cdb = cdb;
-
-    /* Initialize the CDB from the configuration file */
-    ret = confdb_test(ctx->cdb);
-    if (ret == ENOENT) {
-        /* First-time setup */
-
-        /* Purge any existing confdb in case an old
-         * misconfiguration gets in the way
-         */
-        talloc_free(ctx->cdb);
-        cdb_file = talloc_asprintf(ctx, "%s/%s", DB_PATH, CONFDB_FILE);
-        if (cdb_file == NULL) {
-            DEBUG(0,("Out of memory, aborting!\n"));
-            talloc_free(ctx);
-            return ENOMEM;
-        }
-
-        unlink(cdb_file);
-        ret = confdb_init(ctx, &ctx->cdb, cdb_file);
-        if (ret != EOK) {
-            DEBUG(0,("The confdb initialization failed\n"));
-            talloc_free(ctx);
-            return ret;
-        }
-
-        /* Load special entries */
-        ret = confdb_create_base(ctx->cdb);
-        if (ret != EOK) {
-            talloc_free(ctx);
-            return ret;
-        }
-    } else if (ret != EOK) {
-        DEBUG(0, ("Fatal error initializing confdb\n"));
-        talloc_free(ctx);
-        return ret;
-    }
-
-    ret = confdb_init_db(config_file, ctx->cdb);
-    if (ret != EOK) {
-        DEBUG(0, ("ConfDB initialization has failed [%s]\n",
-              strerror(ret)));
-        talloc_free(ctx);
-        return ret;
-    }
-
-    /* Read in the monitor's configuration */
-    ret = get_monitor_config(ctx);
-    if (ret != EOK) {
-        talloc_free(ctx);
-        return ret;
-    }
-
     /* Watch for changes to the confdb config file */
     ret = monitor_config_file(ctx, ctx, config_file, monitor_signal_reconf);
     if (ret != EOK) {
-        talloc_free(ctx);
         return ret;
     }
 
@@ -1856,7 +1873,6 @@ int monitor_process_init(TALLOC_CTX *mem_ctx,
     ret = monitor_config_file(ctx, ctx, RESOLV_CONF_PATH,
                               monitor_update_resolv);
     if (ret != EOK) {
-        talloc_free(ctx);
         return ret;
     }
 
@@ -1864,19 +1880,21 @@ int monitor_process_init(TALLOC_CTX *mem_ctx,
      * We need to handle DB upgrades or DB creation only
      * in one process before all other start.
      */
-    ret = sysdb_init(mem_ctx, ctx->ev, ctx->cdb, NULL, true, &db_list);
+    tmp_ctx = talloc_new(NULL);
+    if (!tmp_ctx) {
+        return ENOMEM;
+    }
+    ret = sysdb_init(tmp_ctx, ctx->ev, ctx->cdb, NULL, true, &db_list);
     if (ret != EOK) {
-        talloc_free(ctx);
         return ret;
     }
-    talloc_free(db_list);
+    talloc_zfree(tmp_ctx);
 
     /* Initialize D-BUS Server
      * The monitor will act as a D-BUS server for all
      * SSSD processes */
     ret = monitor_dbus_init(ctx);
     if (ret != EOK) {
-        talloc_free(ctx);
         return ret;
     }
 
@@ -1897,7 +1915,6 @@ int monitor_process_init(TALLOC_CTX *mem_ctx,
     tes = tevent_add_signal(ctx->ev, ctx, SIGHUP, 0,
                             monitor_hup, ctx);
     if (tes == NULL) {
-        talloc_free(ctx);
         return EIO;
     }
 
@@ -1905,7 +1922,6 @@ int monitor_process_init(TALLOC_CTX *mem_ctx,
     tes = tevent_add_signal(ctx->ev, ctx, SIGINT, 0,
                             monitor_quit, ctx);
     if (tes == NULL) {
-        talloc_free(ctx);
         return EIO;
     }
 
@@ -1913,7 +1929,6 @@ int monitor_process_init(TALLOC_CTX *mem_ctx,
     tes = tevent_add_signal(ctx->ev, ctx, SIGTERM, 0,
                             monitor_quit, ctx);
     if (tes == NULL) {
-        talloc_free(ctx);
         return EIO;
     }
 
@@ -2332,6 +2347,8 @@ int main(int argc, const char *argv[])
     char *config_file = NULL;
     int flags = 0;
     struct main_context *main_ctx;
+    TALLOC_CTX *tmp_ctx;
+    struct mt_ctx *monitor;
     int ret;
 
     struct poptOption long_options[] = {
@@ -2365,13 +2382,18 @@ int main(int argc, const char *argv[])
 
     poptFreeContext(pc);
 
+    tmp_ctx = talloc_new(NULL);
+    if (!tmp_ctx) {
+        return 7;
+    }
+
     if (opt_daemon) flags |= FLAGS_DAEMON;
     if (opt_interactive) flags |= FLAGS_INTERACTIVE;
 
     if (opt_config_file)
-        config_file = talloc_strdup(NULL, opt_config_file);
+        config_file = talloc_strdup(tmp_ctx, opt_config_file);
     else
-        config_file = talloc_strdup(NULL, CONFDB_DEFAULT_CONFIG_FILE);
+        config_file = talloc_strdup(tmp_ctx, CONFDB_DEFAULT_CONFIG_FILE);
     if(!config_file)
         return 6;
 
@@ -2379,19 +2401,20 @@ int main(int argc, const char *argv[])
     flags |= FLAGS_PID_FILE;
 
     /* Parse config file, fail if cannot be done */
-    ret = read_config_file(config_file);
+    ret = load_configuration(tmp_ctx, config_file, &monitor);
     if (ret != EOK) return 4;
 
     /* set up things like debug , signals, daemonization, etc... */
     ret = server_setup("sssd", flags, MONITOR_CONF_ENTRY, &main_ctx);
     if (ret != EOK) return 2;
 
-    ret = monitor_process_init(main_ctx,
-                               main_ctx->event_ctx,
-                               main_ctx->confdb_ctx,
+    monitor->ev = main_ctx->event_ctx;
+    talloc_steal(main_ctx, monitor);
+
+    ret = monitor_process_init(monitor,
                                config_file);
     if (ret != EOK) return 3;
-    talloc_free(config_file);
+    talloc_free(tmp_ctx);
 
     /* loop on main */
     server_loop(main_ctx);
diff --git a/server/monitor/monitor.h b/server/monitor/monitor.h
index 0127bbf..78e10ef 100644
--- a/server/monitor/monitor.h
+++ b/server/monitor/monitor.h
@@ -28,9 +28,9 @@
 typedef int (*monitor_reconf_fn) (struct config_file_ctx *file_ctx,
                                   const char *filename);
 
-int monitor_process_init(TALLOC_CTX *mem_ctx,
-                         struct tevent_context *event_ctx,
-                         struct confdb_ctx *cdb,
+struct mt_ctx;
+
+int monitor_process_init(struct mt_ctx *ctx,
                          const char *config_file);
 
 #endif /* _MONITOR_H */
-- 
1.6.2.5

Attachment: signature.asc
Description: OpenPGP digital signature

_______________________________________________
sssd-devel mailing list
sssd-devel@lists.fedorahosted.org
https://fedorahosted.org/mailman/listinfo/sssd-devel

Reply via email to