Free everything before exiting

This cleans up valgrind --show-reachable.
This commit is contained in:
Michael Spang 2009-01-31 17:34:59 -05:00
parent 2806b4a15e
commit 49004af3ca
14 changed files with 142 additions and 27 deletions

View File

@ -69,13 +69,18 @@ int addclub(void) {
notice("%s", ret->messages[i]->message); notice("%s", ret->messages[i]->message);
} }
ceo__add_user_response__free_unpacked(ret, &protobuf_c_default_allocator);
strbuf_release(&preq);
strbuf_release(&pret);
return 0; return 0;
} }
int main(int argc, char *argv[]) { int main(int argc, char *argv[]) {
int opt; int opt;
int ret;
prog = basename(argv[0]); prog = xstrdup(basename(argv[0]));
init_log(prog, 0, LOG_AUTHPRIV); init_log(prog, 0, LOG_AUTHPRIV);
configure(); configure();
@ -98,5 +103,10 @@ int main(int argc, char *argv[]) {
lib_dir = getenv("CEO_LIB_DIR") ?: default_lib_dir; lib_dir = getenv("CEO_LIB_DIR") ?: default_lib_dir;
return addclub(); ret = addclub();
free_config();
free(prog);
return ret;
} }

View File

@ -79,13 +79,18 @@ int addmember(void) {
notice("%s", ret->messages[i]->message); notice("%s", ret->messages[i]->message);
} }
ceo__add_user_response__free_unpacked(ret, &protobuf_c_default_allocator);
strbuf_release(&preq);
strbuf_release(&pret);
return 0; return 0;
} }
int main(int argc, char *argv[]) { int main(int argc, char *argv[]) {
int opt; int opt;
int ret;
prog = basename(argv[0]); prog = xstrdup(basename(argv[0]));
init_log(prog, 0, LOG_AUTHPRIV); init_log(prog, 0, LOG_AUTHPRIV);
configure(); configure();
@ -114,5 +119,10 @@ int main(int argc, char *argv[]) {
lib_dir = getenv("CEO_LIB_DIR") ?: default_lib_dir; lib_dir = getenv("CEO_LIB_DIR") ?: default_lib_dir;
return addmember(); ret = addmember();
free_config();
free(prog);
return ret;
} }

View File

@ -136,13 +136,15 @@ int client_main(char *op_name) {
int main(int argc, char *argv[]) { int main(int argc, char *argv[]) {
int opt; int opt;
int ret;
char *op; char *op;
prog = basename(argv[0]); prog = xstrdup(basename(argv[0]));
init_log(prog, 0, LOG_USER); init_log(prog, 0, LOG_USER);
configure(); configure();
setup_ops(); setup_ops();
setup_fqdn();
while ((opt = getopt_long(argc, argv, "", opts, NULL)) != -1) { while ((opt = getopt_long(argc, argv, "", opts, NULL)) != -1) {
switch (opt) { switch (opt) {
@ -159,5 +161,13 @@ int main(int argc, char *argv[]) {
op = argv[optind++]; op = argv[optind++];
return client_main(op); ret = client_main(op);
free_gss();
free_fqdn();
free_config();
free_ops();
free(prog);
return ret;
} }

View File

@ -54,7 +54,7 @@ void config_var(char *var, char *val) {
} }
} }
void configure() { void configure(void) {
int i; int i;
char conffile[1024]; char conffile[1024];
@ -80,3 +80,12 @@ void configure() {
} }
} }
} }
void free_config(void) {
for (int i = 0; i < sizeof(config_vars)/sizeof(*config_vars); i++) {
if (config_vars[i].type == CONFIG_TYPE_STR) {
free(*(char **)config_vars[i].p);
*(char **)config_vars[i].p = NULL;
}
}
}

View File

@ -4,6 +4,7 @@
#undef CONFIG_STR #undef CONFIG_STR
#undef CONFIG_INT #undef CONFIG_INT
void configure(); void configure(void);
void free_config(void);
extern const char *config_dir; extern const char *config_dir;

View File

@ -142,13 +142,18 @@ static int master_main(void) {
while (!terminate) while (!terminate)
accept_one_client(sock); accept_one_client(sock);
free_gss();
free_fqdn();
free_ops();
return 0; return 0;
} }
int main(int argc, char *argv[]) { int main(int argc, char *argv[]) {
int opt; int opt;
int ret;
prog = basename(argv[0]); prog = xstrdup(basename(argv[0]));
init_log(prog, LOG_PID, LOG_DAEMON); init_log(prog, LOG_PID, LOG_DAEMON);
configure(); configure();
@ -169,5 +174,10 @@ int main(int argc, char *argv[]) {
if (argc != optind) if (argc != optind)
usage(); usage();
return master_main(); ret = master_main();
free_config();
free(prog);
return ret;
} }

View File

@ -142,5 +142,12 @@ void slave_main(int sock, struct sockaddr *addr) {
notice("connection closed by peer %s", addrstr); notice("connection closed by peer %s", addrstr);
strbuf_release(&msg); strbuf_release(&msg);
/* stuff allocated by dmaster */
free_gss();
free_config();
free_fqdn();
free_ops();
free(prog);
} }

View File

@ -12,13 +12,43 @@ static gss_cred_id_t my_creds = GSS_C_NO_CREDENTIAL;
static gss_ctx_id_t context_handle = GSS_C_NO_CONTEXT; static gss_ctx_id_t context_handle = GSS_C_NO_CONTEXT;
static gss_name_t peer_name = GSS_C_NO_NAME; static gss_name_t peer_name = GSS_C_NO_NAME;
static gss_name_t imported_service = GSS_C_NO_NAME; static gss_name_t imported_service = GSS_C_NO_NAME;
static gss_OID mech_type = GSS_C_NO_OID; static char *peer_principal;
static gss_buffer_desc peer_principal;
static char *peer_username; static char *peer_username;
static OM_uint32 ret_flags; static OM_uint32 ret_flags;
static int complete; static int complete;
char service_name[128]; char service_name[128];
void free_gss(void) {
OM_uint32 maj_stat, min_stat;
if (peer_name) {
maj_stat = gss_release_name(&min_stat, &peer_name);
if (maj_stat != GSS_S_COMPLETE)
gss_fatal("gss_release_name", maj_stat, min_stat);
}
if (imported_service) {
maj_stat = gss_release_name(&min_stat, &imported_service);
if (maj_stat != GSS_S_COMPLETE)
gss_fatal("gss_release_name", maj_stat, min_stat);
}
if (context_handle) {
maj_stat = gss_delete_sec_context(&min_stat, &context_handle, GSS_C_NO_BUFFER);
if (maj_stat != GSS_S_COMPLETE)
gss_fatal("gss_delete_sec_context", maj_stat, min_stat);
}
if (my_creds) {
maj_stat = gss_release_cred(&min_stat, &my_creds);
if (maj_stat != GSS_S_COMPLETE)
gss_fatal("gss_release_creds", maj_stat, min_stat);
}
free(peer_principal);
free(peer_username);
}
static void display_status(char *prefix, OM_uint32 code, int type) { static void display_status(char *prefix, OM_uint32 code, int type) {
OM_uint32 maj_stat, min_stat; OM_uint32 maj_stat, min_stat;
gss_buffer_desc msg; gss_buffer_desc msg;
@ -101,28 +131,44 @@ void client_acquire_creds(const char *service, const char *hostname) {
import_service(service, hostname); import_service(service, hostname);
} }
static char *princ_to_username(char *princ) {
char *ret = xstrdup(princ);
char *c = strchr(ret, '@');
if (c)
*c = '\0';
return ret;
}
int process_server_token(gss_buffer_t incoming_tok, gss_buffer_t outgoing_tok) { int process_server_token(gss_buffer_t incoming_tok, gss_buffer_t outgoing_tok) {
OM_uint32 maj_stat, min_stat; OM_uint32 maj_stat, min_stat;
OM_uint32 time_rec; OM_uint32 time_rec;
gss_OID name_type; gss_OID name_type;
gss_buffer_desc peer_princ;
if (complete) if (complete)
fatal("unexpected %zd-byte token from peer", incoming_tok->length); fatal("unexpected %zd-byte token from peer", incoming_tok->length);
maj_stat = gss_accept_sec_context(&min_stat, &context_handle, my_creds, maj_stat = gss_accept_sec_context(&min_stat, &context_handle, my_creds,
incoming_tok, GSS_C_NO_CHANNEL_BINDINGS, &peer_name, &mech_type, incoming_tok, GSS_C_NO_CHANNEL_BINDINGS, &peer_name, NULL,
outgoing_tok, &ret_flags, &time_rec, NULL); outgoing_tok, &ret_flags, &time_rec, NULL);
if (maj_stat == GSS_S_COMPLETE) { if (maj_stat == GSS_S_COMPLETE) {
check_services(ret_flags); check_services(ret_flags);
complete = 1; complete = 1;
maj_stat = gss_display_name(&min_stat, peer_name, &peer_principal, &name_type); maj_stat = gss_display_name(&min_stat, peer_name, &peer_princ, &name_type);
if (maj_stat != GSS_S_COMPLETE) if (maj_stat != GSS_S_COMPLETE)
gss_fatal("gss_display_name", maj_stat, min_stat); gss_fatal("gss_display_name", maj_stat, min_stat);
notice("client authenticated as %s", (char *)peer_principal.value); peer_principal = xstrdup((char *)peer_princ.value);
debug("context expires in %d seconds",time_rec); peer_username = princ_to_username((char *)peer_princ.value);
notice("client authenticated as %s", peer_principal);
debug("context expires in %d seconds", time_rec);
maj_stat = gss_release_buffer(&min_stat, &peer_princ);
if (maj_stat != GSS_S_COMPLETE)
gss_fatal("gss_release_buffer", maj_stat, min_stat);
} else if (maj_stat != GSS_S_CONTINUE_NEEDED) { } else if (maj_stat != GSS_S_CONTINUE_NEEDED) {
gss_fatal("gss_accept_sec_context", maj_stat, min_stat); gss_fatal("gss_accept_sec_context", maj_stat, min_stat);
@ -165,19 +211,10 @@ int initial_client_token(gss_buffer_t outgoing_tok) {
} }
char *client_principal(void) { char *client_principal(void) {
return complete ? (char *)peer_principal.value : NULL; return peer_principal;
} }
char *client_username(void) { char *client_username(void) {
if (!peer_username) {
char *princ = client_principal();
if (princ) {
peer_username = xstrdup(princ);
char *c = strchr(peer_username, '@');
if (c)
*c = '\0';
}
}
return peer_username; return peer_username;
} }

View File

@ -9,3 +9,4 @@ int process_client_token(gss_buffer_t incoming_tok, gss_buffer_t outgoing_tok);
int initial_client_token(gss_buffer_t outgoing_tok); int initial_client_token(gss_buffer_t outgoing_tok);
char *client_principal(void); char *client_principal(void);
char *client_username(void); char *client_username(void);
void free_gss(void);

View File

@ -26,6 +26,10 @@ void setup_fqdn(void) {
strbuf_addstr(&fqdn, lo->h_name); strbuf_addstr(&fqdn, lo->h_name);
} }
void free_fqdn(void) {
strbuf_release(&fqdn);
}
static size_t recv_one_message(int sock, struct sctp_meta *msg_meta, struct strbuf *msg, int *notification) { static size_t recv_one_message(int sock, struct sctp_meta *msg_meta, struct strbuf *msg, int *notification) {
size_t len = 0; size_t len = 0;
int flags; int flags;

View File

@ -22,6 +22,7 @@ typedef struct sockaddr sa;
extern struct strbuf fqdn; extern struct strbuf fqdn;
extern void setup_fqdn(void); extern void setup_fqdn(void);
extern void free_fqdn(void);
struct sctp_meta { struct sctp_meta {
struct sockaddr_storage from; struct sockaddr_storage from;

View File

@ -261,7 +261,7 @@ void cmd_adduser(void) {
} }
int main(int argc, char *argv[]) { int main(int argc, char *argv[]) {
prog = basename(argv[0]); prog = xstrdup(basename(argv[0]));
init_log(prog, LOG_PID, LOG_AUTHPRIV); init_log(prog, LOG_PID, LOG_AUTHPRIV);
configure(); configure();
@ -279,5 +279,8 @@ int main(int argc, char *argv[]) {
ceo_ldap_cleanup(); ceo_ldap_cleanup();
ceo_krb5_cleanup(); ceo_krb5_cleanup();
free_config();
free(prog);
return 0; return 0;
} }

View File

@ -102,9 +102,20 @@ void setup_ops(void) {
strbuf_list_free(words); strbuf_list_free(words);
} }
fclose(fp);
} }
closedir(dp); closedir(dp);
strbuf_release(&line); strbuf_release(&line);
} }
void free_ops(void) {
while (ops) {
struct op *next = ops->next;
free(ops->name);
free(ops->hostname);
free(ops->path);
free(ops);
ops = next;
}
}

View File

@ -9,5 +9,6 @@ struct op {
}; };
void setup_ops(void); void setup_ops(void);
void free_ops(void);
struct op *find_op(const char *name); struct op *find_op(const char *name);
struct op *get_local_op(uint32_t id); struct op *get_local_op(uint32_t id);