Free everything before exiting
This cleans up valgrind --show-reachable.
This commit is contained in:
parent
2806b4a15e
commit
49004af3ca
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
14
src/ceoc.c
14
src/ceoc.c
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
11
src/config.c
11
src/config.c
|
@ -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;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
69
src/gss.c
69
src/gss.c
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
11
src/ops.c
11
src/ops.c
|
@ -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;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in New Issue