diff options
| author | Linus Nordberg <linus@nordu.net> | 2011-03-06 14:30:14 +0100 | 
|---|---|---|
| committer | Linus Nordberg <linus@nordu.net> | 2011-03-06 14:30:14 +0100 | 
| commit | f87be530d67823a5d82367468e33d58b201ebee1 (patch) | |
| tree | cd56779320f50aefeb1357dd072c686e59353ac3 /lib | |
| parent | c1de57efcaa05f4127a73f99c9f366149dc4b98f (diff) | |
Don't free config object until we destroy the context.
Diffstat (limited to 'lib')
| -rw-r--r-- | lib/conf.c | 28 | ||||
| -rw-r--r-- | lib/include/radsec/radsec-impl.h | 2 | ||||
| -rw-r--r-- | lib/radsec.c | 5 | 
3 files changed, 25 insertions, 10 deletions
| @@ -31,9 +31,12 @@  int  rs_context_read_config(struct rs_context *ctx, const char *config_file)  { -    /* FIXME: Missing some error handling in rs_context_read_config().  */ +  cfg_t *cfg, *cfg_config, *cfg_server; +  int i, j; +  const char *s; +    cfg_opt_t server_opts[] =      {        CFG_STR ("hostname", NULL, CFGF_NONE), @@ -58,8 +61,6 @@ rs_context_read_config(struct rs_context *ctx, const char *config_file)        CFG_SEC ("config", config_opts, CFGF_TITLE | CFGF_MULTI),        CFG_END ()      }; -  cfg_t *cfg, *cfg_config, *cfg_server; -  int i, j;    cfg = cfg_init (opts, CFGF_NONE);    if (cfg_parse (cfg, config_file) == CFG_PARSE_ERROR) @@ -81,7 +82,11 @@ rs_context_read_config(struct rs_context *ctx, const char *config_file)        else  	  ctx->realms = r;        cfg_config = cfg_getnsec (cfg, "config", i); -      r->name = strdup (cfg_title (cfg_config)); +      s = cfg_title (cfg_config); +      if (s == NULL) +	return rs_err_ctx_push_fl (ctx, RSE_CONFIG, __FILE__, __LINE__, +				   "missing config name"); +      r->name = strdup (s);        typestr = cfg_getstr (cfg_config, "type");        if (!strcmp (typestr, "UDP")) @@ -98,10 +103,10 @@ rs_context_read_config(struct rs_context *ctx, const char *config_file)        r->timeout = cfg_getint (cfg_config, "timeout");        r->retries = cfg_getint (cfg_config, "retries"); -      r->cacertfile = strdup (cfg_getstr (cfg_config, "cacertfile")); -      /*r->cacertpath = strdup (cfg_getstr (cfg_config, "cacertpath"));*/ -      r->certfile = strdup (cfg_getstr (cfg_config, "certfile")); -      r->certkeyfile = strdup (cfg_getstr (cfg_config, "certkeyfile")); +      r->cacertfile = cfg_getstr (cfg_config, "cacertfile"); +      /*r->cacertpath = cfg_getstr (cfg_config, "cacertpath");*/ +      r->certfile = cfg_getstr (cfg_config, "certfile"); +      r->certkeyfile = cfg_getstr (cfg_config, "certkeyfile");        /* Add peers, one per server stanza.  */        for (j = 0; j < cfg_size (cfg_config, "server"); j++) @@ -115,10 +120,13 @@ rs_context_read_config(struct rs_context *ctx, const char *config_file)  	  cfg_server = cfg_getnsec (cfg_config, "server", j);  	  _rs_resolv (&p->addr, r->type, cfg_getstr (cfg_server, "hostname"),  		      cfg_getstr (cfg_server, "service")); -	  p->secret = strdup (cfg_getstr (cfg_server, "secret")); +	  p->secret = cfg_getstr (cfg_server, "secret");  	}      } -  cfg_free (cfg); + +  /* Save config object in context, for freeing in +     rs_context_destroy().  */ +  ctx->cfg =  cfg;    return RSE_OK;  } diff --git a/lib/include/radsec/radsec-impl.h b/lib/include/radsec/radsec-impl.h index 932e5d2..963c821 100644 --- a/lib/include/radsec/radsec-impl.h +++ b/lib/include/radsec/radsec-impl.h @@ -5,6 +5,7 @@  #include <freeradius/libradius.h>  #include <event2/util.h> +#include <confuse.h>  #if defined(RS_ENABLE_TLS)  #include <openssl/ssl.h>  #endif @@ -61,6 +62,7 @@ struct rs_context {      struct rs_alloc_scheme alloc_scheme;      struct rs_error *err;      fr_randctx fr_randctx; +    cfg_t *cfg;  };  struct rs_connection { diff --git a/lib/radsec.c b/lib/radsec.c index f8bd246..afb871e 100644 --- a/lib/radsec.c +++ b/lib/radsec.c @@ -142,6 +142,11 @@ void rs_context_destroy(struct rs_context *ctx)        r = r->next;        rs_free (ctx, tmp);      } + +  if (ctx->cfg) +    cfg_free (ctx->cfg); +  ctx->cfg = NULL; +    rs_free (ctx, ctx);  } | 
