From 4c0c632dfac9430a4b5ad3513e6e5a4990fcfb28 Mon Sep 17 00:00:00 2001 From: "Roger A. Light" Date: Thu, 1 Nov 2018 16:02:20 +0000 Subject: [PATCH] Client memory "leak" fixes. --- client/client_shared.c | 7 +++++-- client/pub_client.c | 45 +++++++++++++++++++++--------------------- client/sub_client.c | 28 +++++++++++++++----------- 3 files changed, 44 insertions(+), 36 deletions(-) diff --git a/client/client_shared.c b/client/client_shared.c index 1e2240b5..41fefa90 100644 --- a/client/client_shared.c +++ b/client/client_shared.c @@ -184,7 +184,6 @@ void client_config_cleanup(struct mosq_config *cfg) mosquitto_property_free_all(&cfg->subscribe_props); mosquitto_property_free_all(&cfg->unsubscribe_props); mosquitto_property_free_all(&cfg->disconnect_props); - mosquitto_property_free_all(&cfg->will_props); } int client_config_load(struct mosq_config *cfg, int pub_or_sub, int argc, char *argv[]) @@ -339,7 +338,11 @@ int client_config_load(struct mosq_config *cfg, int pub_or_sub, int argc, char * } if(!cfg->host){ - cfg->host = "localhost"; + cfg->host = strdup("localhost"); + if(!cfg->host){ + if(!cfg->quiet) fprintf(stderr, "Error: Out of memory.\n"); + return 1; + } } return MOSQ_ERR_SUCCESS; } diff --git a/client/pub_client.c b/client/pub_client.c index ff38e8ee..9b5291db 100644 --- a/client/pub_client.c +++ b/client/pub_client.c @@ -326,18 +326,18 @@ int main(int argc, char *argv[]) return 1; } + mosquitto_lib_init(); + memset(&cfg, 0, sizeof(struct mosq_config)); rc = client_config_load(&cfg, CLIENT_PUB, argc, argv); if(rc){ - client_config_cleanup(&cfg); if(rc == 2){ /* --help */ print_usage(); }else{ fprintf(stderr, "\nUse 'mosquitto_pub --help' to see usage.\n"); } - free(buf); - return 1; + goto cleanup; } topic = cfg.topic; @@ -353,38 +353,31 @@ int main(int argc, char *argv[]) #ifndef WITH_THREADING if(cfg.pub_mode == MSGMODE_STDIN_LINE){ fprintf(stderr, "Error: '-l' mode not available, threading support has not been compiled in.\n"); - free(buf); - return 1; + goto cleanup; } #endif if(cfg.pub_mode == MSGMODE_STDIN_FILE){ if(load_stdin()){ fprintf(stderr, "Error loading input from stdin.\n"); - free(buf); - return 1; + goto cleanup; } }else if(cfg.file_input){ if(load_file(cfg.file_input)){ fprintf(stderr, "Error loading input file \"%s\".\n", cfg.file_input); - free(buf); - return 1; + goto cleanup; } } if(!topic || mode == MSGMODE_NONE){ fprintf(stderr, "Error: Both topic and message must be supplied.\n"); print_usage(); - free(buf); - return 1; + goto cleanup; } - mosquitto_lib_init(); - if(client_id_generate(&cfg, "mosqpub")){ - free(buf); - return 1; + goto cleanup; } mosq = mosquitto_new(cfg.id, true, NULL); @@ -397,9 +390,7 @@ int main(int argc, char *argv[]) if(!quiet) fprintf(stderr, "Error: Invalid id.\n"); break; } - mosquitto_lib_cleanup(); - free(buf); - return 1; + goto cleanup; } if(cfg.debug){ mosquitto_log_callback_set(mosq, my_log_callback); @@ -409,11 +400,12 @@ int main(int argc, char *argv[]) mosquitto_publish_callback_set(mosq, my_publish_callback); if(client_opts_set(mosq, &cfg)){ - free(buf); - return 1; + goto cleanup; } rc = client_connect(mosq, &cfg); - if(rc) return rc; + if(rc){ + goto cleanup; + } if(mode == MSGMODE_STDIN_LINE){ mosquitto_loop_start(mosq); @@ -440,9 +432,8 @@ int main(int argc, char *argv[]) read_len = 1024; buf2 = realloc(buf, buf_len); if(!buf2){ - free(buf); fprintf(stderr, "Error: Out of memory.\n"); - return 1; + goto cleanup; } buf = buf2; } @@ -487,9 +478,17 @@ int main(int argc, char *argv[]) } mosquitto_destroy(mosq); mosquitto_lib_cleanup(); + client_config_cleanup(&cfg); + free(buf); if(rc){ fprintf(stderr, "Error: %s\n", mosquitto_strerror(rc)); } return rc; + +cleanup: + mosquitto_lib_cleanup(); + client_config_cleanup(&cfg); + free(buf); + return 1; } diff --git a/client/sub_client.c b/client/sub_client.c index ce6d4171..8a9cf3a9 100644 --- a/client/sub_client.c +++ b/client/sub_client.c @@ -235,27 +235,26 @@ int main(int argc, char *argv[]) memset(&cfg, 0, sizeof(struct mosq_config)); + mosquitto_lib_init(); + rc = client_config_load(&cfg, CLIENT_SUB, argc, argv); if(rc){ - client_config_cleanup(&cfg); if(rc == 2){ /* --help */ print_usage(); }else{ fprintf(stderr, "\nUse 'mosquitto_sub --help' to see usage.\n"); } - return 1; + goto cleanup; } if(cfg.no_retain && cfg.retained_only){ fprintf(stderr, "\nError: Combining '-R' and '--retained-only' makes no sense.\n"); - return 1; + goto cleanup; } - mosquitto_lib_init(); - if(client_id_generate(&cfg, "mosqsub")){ - return 1; + goto cleanup; } mosq = mosquitto_new(cfg.id, cfg.clean_session, &cfg); @@ -268,11 +267,10 @@ int main(int argc, char *argv[]) if(!cfg.quiet) fprintf(stderr, "Error: Invalid id and/or clean_session.\n"); break; } - mosquitto_lib_cleanup(); - return 1; + goto cleanup; } if(client_opts_set(mosq, &cfg)){ - return 1; + goto cleanup; } if(cfg.debug){ mosquitto_log_callback_set(mosq, my_log_callback); @@ -282,7 +280,9 @@ int main(int argc, char *argv[]) mosquitto_message_callback_set(mosq, my_message_callback); rc = client_connect(mosq, &cfg); - if(rc) return rc; + if(rc){ + goto cleanup; + } #ifndef WIN32 sigact.sa_handler = my_signal_handler; @@ -291,7 +291,7 @@ int main(int argc, char *argv[]) if(sigaction(SIGALRM, &sigact, NULL) == -1){ perror("sigaction"); - return 1; + goto cleanup; } if(cfg.timeout){ @@ -307,9 +307,15 @@ int main(int argc, char *argv[]) if(cfg.msg_count>0 && rc == MOSQ_ERR_NO_CONN){ rc = 0; } + client_config_cleanup(&cfg); if(rc){ fprintf(stderr, "Error: %s\n", mosquitto_strerror(rc)); } return rc; + +cleanup: + mosquitto_lib_cleanup(); + client_config_cleanup(&cfg); + return 1; }