Fix definitely lost memleaks reported by valgrind

Fix a major memset() mistake leaking memory and possibly breaking CA
chains for proxyspecs and struct filtering rules.
Fix wrong memset size.
Fix redundant WUNRES attrib, MALLOC attrib has WUNRES already.
And fix param names.
pull/48/head
Soner Tari 3 years ago
parent d07606b586
commit 79bacaeff3

@ -230,6 +230,8 @@ filter_rule_free(filter_rule_t *rule)
if (rule->desc)
free(rule->desc);
#endif /* !WITHOUT_USERAUTH */
if (rule->action.conn_opts)
conn_opts_free(rule->action.conn_opts);
free(rule);
}
@ -446,7 +448,7 @@ filter_macro_copy(macro_t *macro, const char *argv0, opts_t *opts)
}
int
filter_rule_copy(filter_rule_t *rule, const char *argv0, opts_t *opts)
filter_rule_copy(filter_rule_t *rule, const char *argv0, opts_t *opts, tmp_opts_t *tmp_opts)
{
while (rule) {
filter_rule_t *r = malloc(sizeof(filter_rule_t));
@ -530,6 +532,13 @@ filter_rule_copy(filter_rule_t *rule, const char *argv0, opts_t *opts)
// The action field is not a pointer, hence the direct assignment (copy)
r->action = rule->action;
// But deep copy for conn_opts
if (rule->action.conn_opts) {
r->action.conn_opts = conn_opts_copy(rule->action.conn_opts, argv0, tmp_opts);
if (!r->action.conn_opts)
return oom_return(argv0);
}
append_list(&opts->filter_rules, r, filter_rule_t);
rule = rule->next;
@ -1520,6 +1529,7 @@ filter_rule_dbg_print(filter_rule_t *rule)
if (!s)
return;
log_dbg_printf("%s", s);
free(s);
}
#endif /* DEBUG_OPTS */
@ -1742,7 +1752,11 @@ filter_macro_set(opts_t *opts, char *value, unsigned int line_num)
append_list(&opts->macro, macro, macro_t);
#ifdef DEBUG_OPTS
log_dbg_printf("Macro: %s = %s\n", macro->name, filter_value_str(macro->value));
char *s = filter_value_str(macro->value);
if (!s)
return oom_return_na();
log_dbg_printf("Macro: %s = %s\n", macro->name, s);
free(s);
#endif /* DEBUG_OPTS */
return 0;
}

@ -306,7 +306,7 @@ void filter_rules_free(opts_t *) NONNULL(1);
void filter_free(opts_t *) NONNULL(1);
int filter_macro_copy(macro_t *, const char *, opts_t *) NONNULL(2,3) WUNRES;
int filter_rule_copy(filter_rule_t *, const char *, opts_t *) NONNULL(2,3) WUNRES;
int filter_rule_copy(filter_rule_t *, const char *, opts_t *, tmp_opts_t *) NONNULL(2,3) WUNRES;
char *filter_macro_str(macro_t *);
char *filter_rule_str(filter_rule_t *);

@ -123,9 +123,7 @@ opts_load_cert_chain_key(const char *filename)
conn_opts_t *
conn_opts_new(void)
{
conn_opts_t *conn_opts;
conn_opts = malloc(sizeof(conn_opts_t));
conn_opts_t *conn_opts = malloc(sizeof(conn_opts_t));
if (!conn_opts)
return oom_return_na_null();
memset(conn_opts, 0, sizeof(conn_opts_t));
@ -192,9 +190,6 @@ global_new(void)
void
conn_opts_free(conn_opts_t *conn_opts)
{
if (conn_opts->chain) {
sk_X509_pop_free(conn_opts->chain, X509_free);
}
if (conn_opts->clientcrt) {
X509_free(conn_opts->clientcrt);
}
@ -207,6 +202,9 @@ conn_opts_free(conn_opts_t *conn_opts)
if (conn_opts->cakey) {
EVP_PKEY_free(conn_opts->cakey);
}
if (conn_opts->chain) {
sk_X509_pop_free(conn_opts->chain, X509_free);
}
#ifndef OPENSSL_NO_DH
if (conn_opts->dh) {
DH_free(conn_opts->dh);
@ -229,7 +227,7 @@ conn_opts_free(conn_opts_t *conn_opts)
}
#endif /* !WITHOUT_USERAUTH */
memset(conn_opts, 0, sizeof(opts_t));
memset(conn_opts, 0, sizeof(conn_opts_t));
free(conn_opts);
}
@ -551,7 +549,6 @@ conn_opts_copy(conn_opts_t *conn_opts, const char *argv0, tmp_opts_t *tmp_opts)
conn_opts_t *cops = conn_opts_new();
if (!cops)
return NULL;
memset(cops, 0, sizeof(conn_opts_t));
cops->sslcomp = conn_opts->sslcomp;
#ifdef HAVE_SSLV2
@ -648,7 +645,7 @@ conn_opts_copy(conn_opts_t *conn_opts, const char *argv0, tmp_opts_t *tmp_opts)
}
static opts_t * WUNRES
global_opts_copy(global_t *global, const char *argv0)
global_opts_copy(global_t *global, const char *argv0, tmp_opts_t *tmp_opts)
{
#ifdef DEBUG_OPTS
log_dbg_printf("Copy global opts\n");
@ -672,7 +669,7 @@ global_opts_copy(global_t *global, const char *argv0)
if (filter_macro_copy(global->opts->macro, argv0, opts) == -1)
return oom_return_null(argv0);
if (filter_rule_copy(global->opts->filter_rules, argv0, opts) == -1)
if (filter_rule_copy(global->opts->filter_rules, argv0, opts, tmp_opts) == -1)
return oom_return_null(argv0);
return opts;
@ -688,7 +685,7 @@ proxyspec_new(global_t *global, const char *argv0, tmp_opts_t *tmp_opts)
spec->conn_opts = conn_opts_copy(global->conn_opts, argv0, tmp_opts);
if (!spec->conn_opts)
return NULL;
spec->opts = global_opts_copy(global, argv0);
spec->opts = global_opts_copy(global, argv0, tmp_opts);
if (!spec->opts)
return NULL;
return spec;
@ -1443,7 +1440,7 @@ opts_set_cakey(conn_opts_t *conn_opts, const char *argv0, const char *optarg, tm
}
int
opts_set_chain(conn_opts_t *opts, const char *argv0, const char *optarg, tmp_opts_t *tmp_opts)
opts_set_chain(conn_opts_t *conn_opts, const char *argv0, const char *optarg, tmp_opts_t *tmp_opts)
{
if (tmp_opts) {
if (tmp_opts->chain_str)
@ -1453,7 +1450,7 @@ opts_set_chain(conn_opts_t *opts, const char *argv0, const char *optarg, tmp_opt
return oom_return(argv0);
}
if (ssl_x509chain_load(NULL, &opts->chain, optarg) == -1) {
if (ssl_x509chain_load(NULL, &conn_opts->chain, optarg) == -1) {
fprintf(stderr, "%s: error loading chain from '%s':\n",
argv0, optarg);
if (errno) {
@ -1557,7 +1554,7 @@ opts_set_clientcrt(conn_opts_t *conn_opts, const char *argv0, const char *optarg
}
int
opts_set_clientkey(conn_opts_t *opts, const char *argv0, const char *optarg, tmp_opts_t *tmp_opts)
opts_set_clientkey(conn_opts_t *conn_opts, const char *argv0, const char *optarg, tmp_opts_t *tmp_opts)
{
if (tmp_opts) {
if (tmp_opts->clientkey_str)
@ -1567,10 +1564,10 @@ opts_set_clientkey(conn_opts_t *opts, const char *argv0, const char *optarg, tmp
return oom_return(argv0);
}
if (opts->clientkey)
EVP_PKEY_free(opts->clientkey);
opts->clientkey = ssl_key_load(optarg);
if (!opts->clientkey) {
if (conn_opts->clientkey)
EVP_PKEY_free(conn_opts->clientkey);
conn_opts->clientkey = ssl_key_load(optarg);
if (!conn_opts->clientkey) {
fprintf(stderr, "%s: error loading client key from '%s':\n",
argv0, optarg);
if (errno) {

@ -283,18 +283,18 @@ cert_t *opts_load_cert_chain_key(const char *) NONNULL(1);
void opts_unset_divert(opts_t *) NONNULL(1);
void proxyspec_free(proxyspec_t *);
proxyspec_t *proxyspec_new(global_t *, const char *, tmp_opts_t *) MALLOC WUNRES;
proxyspec_t *proxyspec_new(global_t *, const char *, tmp_opts_t *) MALLOC;
int proxyspec_set_proto(proxyspec_t *, const char *) NONNULL(1,2) WUNRES;
int proxyspec_parse(int *, char **[], const char *, global_t *, const char *, tmp_opts_t *) WUNRES;
char *conn_opts_str(conn_opts_t *);
char *proxyspec_str(proxyspec_t *) NONNULL(1) MALLOC WUNRES;
char *proxyspec_str(proxyspec_t *) NONNULL(1) MALLOC;
conn_opts_t *conn_opts_new(void) MALLOC WUNRES;
opts_t *opts_new(void) MALLOC WUNRES;
conn_opts_t *conn_opts_new(void) MALLOC;
opts_t *opts_new(void) MALLOC;
void opts_free(opts_t *) NONNULL(1);
void conn_opts_free(conn_opts_t *);
tmp_opts_t *tmp_opts_copy(tmp_opts_t *) NONNULL(1) MALLOC WUNRES;
tmp_opts_t *tmp_opts_copy(tmp_opts_t *) NONNULL(1) MALLOC;
conn_opts_t *conn_opts_copy(conn_opts_t *, const char *, tmp_opts_t *) WUNRES;
int opts_set_cacrt(conn_opts_t *, const char *, const char *, tmp_opts_t *) NONNULL(1,2,3) WUNRES;
int opts_set_cakey(conn_opts_t *, const char *, const char *, tmp_opts_t *) NONNULL(1,2,3) WUNRES;

Loading…
Cancel
Save