From a29c3f1a7a00684804b032970ed347fa05ca9cce Mon Sep 17 00:00:00 2001 From: linus Date: Fri, 21 Jan 2011 13:09:00 +0100 Subject: [PATCH] Fix bug where one or two stanzas in a config file would be but not more. Also restructure error handling in rs_context_create(). --- lib/conf.c | 12 ++++---- lib/radsec.c | 92 ++++++++++++++++++++++++++++++++++++------------------------ 2 files changed, 60 insertions(+), 44 deletions(-) diff --git a/lib/conf.c b/lib/conf.c index d42f2cd..8519922 100644 --- a/lib/conf.c +++ b/lib/conf.c @@ -70,10 +70,8 @@ rs_context_read_config(struct rs_context *ctx, const char *config_file) if (!r) return rs_err_ctx_push_fl (ctx, RSE_NOMEM, __FILE__, __LINE__, NULL); memset (r, 0, sizeof(*r)); - if (ctx->realms) - ctx->realms->next = r; - else - ctx->realms = r; + r->next = ctx->realms->next; + ctx->realms->next = r; cfg_config = cfg_getnsec (cfg, "config", i); r->name = strdup (cfg_title (cfg_config)); @@ -115,12 +113,12 @@ rs_context_read_config(struct rs_context *ctx, const char *config_file) return RSE_OK; } -struct rs_realm -*rs_conf_find_realm(struct rs_context *ctx, const char *name) +struct rs_realm * +rs_conf_find_realm(struct rs_context *ctx, const char *name) { struct rs_realm *r; - for (r = ctx->realms; r; r = r->next) + for (r = ctx->realms->next; r != ctx->realms; r = r->next) if (!strcmp (r->name, name)) return r; return NULL; diff --git a/lib/radsec.c b/lib/radsec.c index 40d14fc..bc06894 100644 --- a/lib/radsec.c +++ b/lib/radsec.c @@ -26,55 +26,73 @@ int rs_context_create(struct rs_context **ctx, const char *dict) { + int err = RSE_OK; struct rs_context *h; + char *buf1 = NULL, *buf2 = NULL; + char *dir, *fn; + + assert (dict); if (ctx) *ctx = NULL; h = (struct rs_context *) malloc (sizeof(struct rs_context)); - if (h) + if (!h) + return RSE_NOMEM; + + /* Initialize freeradius dictionary. */ + buf1 = malloc (strlen (dict) + 1); + buf2 = malloc (strlen (dict) + 1); + if (!buf1 || !buf2) + { + err = RSE_NOMEM; + goto err_out; + } + strcpy (buf1, dict); + dir = dirname (buf1); + strcpy (buf2, dict); + fn = basename (buf2); + if (dict_init (dir, fn) < 0) { - char *buf1 = NULL, *buf2 = NULL; - char *dir, *fn; - - buf1 = malloc (strlen (dict) + 1); - buf2 = malloc (strlen (dict) + 1); - if (!buf1 || !buf2) - { - free (h); - if (buf1) - free (buf1); - if (buf2) - free (buf2); - return RSE_NOMEM; - } - strcpy (buf1, dict); - dir = dirname (buf1); - strcpy (buf2, dict); - fn = basename (buf2); - if (dict_init (dir, fn) < 0) - { - free (h); - return RSE_SOME_ERROR; - } - free (buf1); - free (buf2); + err = RSE_SOME_ERROR; + goto err_out; + } + free (buf1); + free (buf2); + #if defined RS_ENABLE_TLS - ssl_init (); + ssl_init (); #endif #if defined (DEBUG) - fr_log_fp = stderr; - fr_debug_flag = 1; + fr_log_fp = stderr; + fr_debug_flag = 1; #endif - debug_init ("libradsec"); /* radsecproxy compat, FIXME: remove */ - - memset (h, 0, sizeof(struct rs_context)); - fr_randinit (&h->fr_randctx, 0); - fr_rand_seed (NULL, 0); + debug_init ("libradsec"); /* radsecproxy compat, FIXME: remove */ - if (ctx) - *ctx = h; + memset (h, 0, sizeof(struct rs_context)); + h->realms = malloc (sizeof (struct rs_realm)); + if (!h->realms) + { + err = RSE_NOMEM; + goto err_out; } - return h ? RSE_OK : RSE_NOMEM; + memset (h->realms, 0, sizeof (struct rs_realm)); + h->realms->next = h->realms; + fr_randinit (&h->fr_randctx, 0); + fr_rand_seed (NULL, 0); + + if (ctx) + *ctx = h; + + return RSE_OK; + + err_out: + if (buf1) + free (buf1); + if (buf2) + free (buf2); + if (h) + free (h); + return err; } void rs_context_destroy(struct rs_context *ctx) -- 2.1.4