Client memory "leak" fixes.

pull/1022/head
Roger A. Light 7 years ago
parent 8aa936936e
commit 4c0c632dfa

@ -184,7 +184,6 @@ void client_config_cleanup(struct mosq_config *cfg)
mosquitto_property_free_all(&cfg->subscribe_props); mosquitto_property_free_all(&cfg->subscribe_props);
mosquitto_property_free_all(&cfg->unsubscribe_props); mosquitto_property_free_all(&cfg->unsubscribe_props);
mosquitto_property_free_all(&cfg->disconnect_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[]) 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){ 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; return MOSQ_ERR_SUCCESS;
} }

@ -326,18 +326,18 @@ int main(int argc, char *argv[])
return 1; return 1;
} }
mosquitto_lib_init();
memset(&cfg, 0, sizeof(struct mosq_config)); memset(&cfg, 0, sizeof(struct mosq_config));
rc = client_config_load(&cfg, CLIENT_PUB, argc, argv); rc = client_config_load(&cfg, CLIENT_PUB, argc, argv);
if(rc){ if(rc){
client_config_cleanup(&cfg);
if(rc == 2){ if(rc == 2){
/* --help */ /* --help */
print_usage(); print_usage();
}else{ }else{
fprintf(stderr, "\nUse 'mosquitto_pub --help' to see usage.\n"); fprintf(stderr, "\nUse 'mosquitto_pub --help' to see usage.\n");
} }
free(buf); goto cleanup;
return 1;
} }
topic = cfg.topic; topic = cfg.topic;
@ -353,38 +353,31 @@ int main(int argc, char *argv[])
#ifndef WITH_THREADING #ifndef WITH_THREADING
if(cfg.pub_mode == MSGMODE_STDIN_LINE){ if(cfg.pub_mode == MSGMODE_STDIN_LINE){
fprintf(stderr, "Error: '-l' mode not available, threading support has not been compiled in.\n"); fprintf(stderr, "Error: '-l' mode not available, threading support has not been compiled in.\n");
free(buf); goto cleanup;
return 1;
} }
#endif #endif
if(cfg.pub_mode == MSGMODE_STDIN_FILE){ if(cfg.pub_mode == MSGMODE_STDIN_FILE){
if(load_stdin()){ if(load_stdin()){
fprintf(stderr, "Error loading input from stdin.\n"); fprintf(stderr, "Error loading input from stdin.\n");
free(buf); goto cleanup;
return 1;
} }
}else if(cfg.file_input){ }else if(cfg.file_input){
if(load_file(cfg.file_input)){ if(load_file(cfg.file_input)){
fprintf(stderr, "Error loading input file \"%s\".\n", cfg.file_input); fprintf(stderr, "Error loading input file \"%s\".\n", cfg.file_input);
free(buf); goto cleanup;
return 1;
} }
} }
if(!topic || mode == MSGMODE_NONE){ if(!topic || mode == MSGMODE_NONE){
fprintf(stderr, "Error: Both topic and message must be supplied.\n"); fprintf(stderr, "Error: Both topic and message must be supplied.\n");
print_usage(); print_usage();
free(buf); goto cleanup;
return 1;
} }
mosquitto_lib_init();
if(client_id_generate(&cfg, "mosqpub")){ if(client_id_generate(&cfg, "mosqpub")){
free(buf); goto cleanup;
return 1;
} }
mosq = mosquitto_new(cfg.id, true, NULL); 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"); if(!quiet) fprintf(stderr, "Error: Invalid id.\n");
break; break;
} }
mosquitto_lib_cleanup(); goto cleanup;
free(buf);
return 1;
} }
if(cfg.debug){ if(cfg.debug){
mosquitto_log_callback_set(mosq, my_log_callback); 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); mosquitto_publish_callback_set(mosq, my_publish_callback);
if(client_opts_set(mosq, &cfg)){ if(client_opts_set(mosq, &cfg)){
free(buf); goto cleanup;
return 1;
} }
rc = client_connect(mosq, &cfg); rc = client_connect(mosq, &cfg);
if(rc) return rc; if(rc){
goto cleanup;
}
if(mode == MSGMODE_STDIN_LINE){ if(mode == MSGMODE_STDIN_LINE){
mosquitto_loop_start(mosq); mosquitto_loop_start(mosq);
@ -440,9 +432,8 @@ int main(int argc, char *argv[])
read_len = 1024; read_len = 1024;
buf2 = realloc(buf, buf_len); buf2 = realloc(buf, buf_len);
if(!buf2){ if(!buf2){
free(buf);
fprintf(stderr, "Error: Out of memory.\n"); fprintf(stderr, "Error: Out of memory.\n");
return 1; goto cleanup;
} }
buf = buf2; buf = buf2;
} }
@ -487,9 +478,17 @@ int main(int argc, char *argv[])
} }
mosquitto_destroy(mosq); mosquitto_destroy(mosq);
mosquitto_lib_cleanup(); mosquitto_lib_cleanup();
client_config_cleanup(&cfg);
free(buf);
if(rc){ if(rc){
fprintf(stderr, "Error: %s\n", mosquitto_strerror(rc)); fprintf(stderr, "Error: %s\n", mosquitto_strerror(rc));
} }
return rc; return rc;
cleanup:
mosquitto_lib_cleanup();
client_config_cleanup(&cfg);
free(buf);
return 1;
} }

@ -235,27 +235,26 @@ int main(int argc, char *argv[])
memset(&cfg, 0, sizeof(struct mosq_config)); memset(&cfg, 0, sizeof(struct mosq_config));
mosquitto_lib_init();
rc = client_config_load(&cfg, CLIENT_SUB, argc, argv); rc = client_config_load(&cfg, CLIENT_SUB, argc, argv);
if(rc){ if(rc){
client_config_cleanup(&cfg);
if(rc == 2){ if(rc == 2){
/* --help */ /* --help */
print_usage(); print_usage();
}else{ }else{
fprintf(stderr, "\nUse 'mosquitto_sub --help' to see usage.\n"); fprintf(stderr, "\nUse 'mosquitto_sub --help' to see usage.\n");
} }
return 1; goto cleanup;
} }
if(cfg.no_retain && cfg.retained_only){ if(cfg.no_retain && cfg.retained_only){
fprintf(stderr, "\nError: Combining '-R' and '--retained-only' makes no sense.\n"); 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")){ if(client_id_generate(&cfg, "mosqsub")){
return 1; goto cleanup;
} }
mosq = mosquitto_new(cfg.id, cfg.clean_session, &cfg); 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"); if(!cfg.quiet) fprintf(stderr, "Error: Invalid id and/or clean_session.\n");
break; break;
} }
mosquitto_lib_cleanup(); goto cleanup;
return 1;
} }
if(client_opts_set(mosq, &cfg)){ if(client_opts_set(mosq, &cfg)){
return 1; goto cleanup;
} }
if(cfg.debug){ if(cfg.debug){
mosquitto_log_callback_set(mosq, my_log_callback); 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); mosquitto_message_callback_set(mosq, my_message_callback);
rc = client_connect(mosq, &cfg); rc = client_connect(mosq, &cfg);
if(rc) return rc; if(rc){
goto cleanup;
}
#ifndef WIN32 #ifndef WIN32
sigact.sa_handler = my_signal_handler; sigact.sa_handler = my_signal_handler;
@ -291,7 +291,7 @@ int main(int argc, char *argv[])
if(sigaction(SIGALRM, &sigact, NULL) == -1){ if(sigaction(SIGALRM, &sigact, NULL) == -1){
perror("sigaction"); perror("sigaction");
return 1; goto cleanup;
} }
if(cfg.timeout){ if(cfg.timeout){
@ -307,9 +307,15 @@ int main(int argc, char *argv[])
if(cfg.msg_count>0 && rc == MOSQ_ERR_NO_CONN){ if(cfg.msg_count>0 && rc == MOSQ_ERR_NO_CONN){
rc = 0; rc = 0;
} }
client_config_cleanup(&cfg);
if(rc){ if(rc){
fprintf(stderr, "Error: %s\n", mosquitto_strerror(rc)); fprintf(stderr, "Error: %s\n", mosquitto_strerror(rc));
} }
return rc; return rc;
cleanup:
mosquitto_lib_cleanup();
client_config_cleanup(&cfg);
return 1;
} }

Loading…
Cancel
Save