From f3777c0662fef9b94e3525d78cbcbfee9964903f Mon Sep 17 00:00:00 2001 From: "Roger A. Light" Date: Wed, 30 Nov 2022 14:33:09 +0000 Subject: [PATCH] Refactor to remove duplicate code. --- src/persist_read.c | 24 +++++++-------- src/persist_read_v234.c | 51 ++++++++----------------------- src/persist_read_v5.c | 67 +++++++++++++---------------------------- 3 files changed, 45 insertions(+), 97 deletions(-) diff --git a/src/persist_read.c b/src/persist_read.c index 0f7745f0..8aeea3e2 100644 --- a/src/persist_read.c +++ b/src/persist_read.c @@ -265,9 +265,7 @@ static int persist__base_msg_chunk_restore(FILE *db_fptr, uint32_t length) }else{ rc = persist__chunk_base_msg_read_v234(db_fptr, &chunk, db_version); } - if(rc){ - return rc; - } + if(rc) return rc; if(chunk.F.source_port){ for(i=0; ilistener_count; i++){ @@ -282,11 +280,8 @@ static int persist__base_msg_chunk_restore(FILE *db_fptr, uint32_t length) message_expiry_interval64 = chunk.F.expiry_time - time(NULL); if(message_expiry_interval64 < 0 || message_expiry_interval64 > UINT32_MAX){ /* Expired message */ - mosquitto__FREE(chunk.source.id); - mosquitto__FREE(chunk.source.username); - mosquitto__FREE(chunk.topic); - mosquitto__FREE(chunk.payload); - return MOSQ_ERR_SUCCESS; + rc = MOSQ_ERR_SUCCESS; + goto cleanup; }else{ message_expiry_interval = (uint32_t)message_expiry_interval64; } @@ -296,12 +291,9 @@ static int persist__base_msg_chunk_restore(FILE *db_fptr, uint32_t length) base_msg = mosquitto__calloc(1, sizeof(struct mosquitto_base_msg)); if(base_msg == NULL){ - mosquitto__FREE(chunk.source.id); - mosquitto__FREE(chunk.source.username); - mosquitto__FREE(chunk.topic); - mosquitto__FREE(chunk.payload); log__printf(NULL, MOSQ_LOG_ERR, "Error: Out of memory."); - return MOSQ_ERR_NOMEM; + rc = MOSQ_ERR_NOMEM; + goto cleanup; } base_msg->source_mid = chunk.F.source_mid; @@ -325,6 +317,12 @@ static int persist__base_msg_chunk_restore(FILE *db_fptr, uint32_t length) }else{ return rc; } +cleanup: + mosquitto__FREE(chunk.source.id); + mosquitto__FREE(chunk.source.username); + mosquitto__FREE(chunk.topic); + mosquitto__FREE(chunk.payload); + return rc; } static int persist__retain_chunk_restore(FILE *db_fptr) diff --git a/src/persist_read_v234.c b/src/persist_read_v234.c index 685ffa32..217f1a43 100644 --- a/src/persist_read_v234.c +++ b/src/persist_read_v234.c @@ -99,7 +99,6 @@ int persist__chunk_client_msg_read_v234(FILE *db_fptr, struct P_client_msg *chun { uint16_t i16temp; int rc; - char *err; uint8_t retain, dup; rc = persist__read_string(db_fptr, &chunk->client_id); @@ -122,8 +121,7 @@ int persist__chunk_client_msg_read_v234(FILE *db_fptr, struct P_client_msg *chun return MOSQ_ERR_SUCCESS; error: - err = strerror(errno); - log__printf(NULL, MOSQ_LOG_ERR, "Error: %s.", err); + log__printf(NULL, MOSQ_LOG_ERR, "Error: %s.", strerror(errno)); mosquitto__FREE(chunk->client_id); return 1; } @@ -134,20 +132,15 @@ int persist__chunk_base_msg_read_v234(FILE *db_fptr, struct P_base_msg *chunk, u uint32_t i32temp; uint16_t i16temp; int rc = 0; - char *err; read_e(db_fptr, &chunk->F.store_id, sizeof(dbid_t)); rc = persist__read_string(db_fptr, &chunk->source.id); - if(rc){ - return rc; - } + if(rc) return rc; + if(db_version == 4){ rc = persist__read_string(db_fptr, &chunk->source.username); - if(rc){ - mosquitto__FREE(chunk->source.id); - return rc; - } + if(rc) goto error; read_e(db_fptr, &i16temp, sizeof(uint16_t)); chunk->F.source_port = ntohs(i16temp); } @@ -159,11 +152,7 @@ int persist__chunk_base_msg_read_v234(FILE *db_fptr, struct P_base_msg *chunk, u read_e(db_fptr, &i16temp, sizeof(uint16_t)); rc = persist__read_string(db_fptr, &chunk->topic); - if(rc){ - mosquitto__FREE(chunk->source.id); - mosquitto__FREE(chunk->source.username); - return rc; - } + if(rc) goto error; read_e(db_fptr, &chunk->F.qos, sizeof(uint8_t)); read_e(db_fptr, &chunk->F.retain, sizeof(uint8_t)); @@ -174,11 +163,8 @@ int persist__chunk_base_msg_read_v234(FILE *db_fptr, struct P_base_msg *chunk, u if(chunk->F.payloadlen){ chunk->payload = mosquitto_malloc(chunk->F.payloadlen+1); if(chunk->payload == NULL){ - mosquitto__FREE(chunk->source.id); - mosquitto__FREE(chunk->source.username); - mosquitto__FREE(chunk->topic); - log__printf(NULL, MOSQ_LOG_ERR, "Error: Out of memory."); - return MOSQ_ERR_NOMEM; + rc = MOSQ_ERR_NOMEM; + goto error; } read_e(db_fptr, chunk->payload, chunk->F.payloadlen); /* Ensure zero terminated regardless of contents */ @@ -187,22 +173,19 @@ int persist__chunk_base_msg_read_v234(FILE *db_fptr, struct P_base_msg *chunk, u return MOSQ_ERR_SUCCESS; error: - err = strerror(errno); - log__printf(NULL, MOSQ_LOG_ERR, "Error: %s.", err); mosquitto__FREE(chunk->source.id); mosquitto__FREE(chunk->source.username); - return 1; + mosquitto__FREE(chunk->topic); + return rc; } int persist__chunk_retain_read_v234(FILE *db_fptr, struct P_retain *chunk) { dbid_t i64temp; - char *err; if(fread(&i64temp, sizeof(dbid_t), 1, db_fptr) != 1){ - err = strerror(errno); - log__printf(NULL, MOSQ_LOG_ERR, "Error: %s.", err); + log__printf(NULL, MOSQ_LOG_ERR, "Error: %s.", strerror(errno)); return 1; } chunk->F.store_id = i64temp; @@ -214,28 +197,20 @@ int persist__chunk_retain_read_v234(FILE *db_fptr, struct P_retain *chunk) int persist__chunk_sub_read_v234(FILE *db_fptr, struct P_sub *chunk) { int rc; - char *err; rc = persist__read_string(db_fptr, &chunk->client_id); - if(rc){ - return rc; - } + if(rc) goto error; rc = persist__read_string(db_fptr, &chunk->topic); - if(rc){ - mosquitto__FREE(chunk->client_id); - return rc; - } + if(rc) goto error; read_e(db_fptr, &chunk->F.qos, sizeof(uint8_t)); return MOSQ_ERR_SUCCESS; error: - err = strerror(errno); - log__printf(NULL, MOSQ_LOG_ERR, "Error: %s.", err); mosquitto__FREE(chunk->client_id); mosquitto__FREE(chunk->topic); - return 1; + return rc; } #endif diff --git a/src/persist_read_v5.c b/src/persist_read_v5.c index 74ff7668..4f724384 100644 --- a/src/persist_read_v5.c +++ b/src/persist_read_v5.c @@ -120,23 +120,19 @@ int persist__chunk_client_msg_read_v56(FILE *db_fptr, struct P_client_msg *chunk length -= (uint32_t)(sizeof(struct PF_client_msg) + chunk->F.id_len); rc = persist__read_string_len(db_fptr, &chunk->client_id, chunk->F.id_len); - if(rc){ - return rc; - } + if(rc) return rc; if(length > 0){ memset(&prop_packet, 0, sizeof(struct mosquitto__packet)); prop_packet.remaining_length = length; prop_packet.payload = mosquitto__malloc(length); - if(!prop_packet.payload){ - return MOSQ_ERR_NOMEM; - } + if(!prop_packet.payload) return MOSQ_ERR_NOMEM; + read_e(db_fptr, prop_packet.payload, length); rc = property__read_all(CMD_PUBLISH, &prop_packet, &properties); mosquitto__FREE(prop_packet.payload); - if(rc){ - return rc; - } + if(rc) return rc; + if(properties){ p = properties; while(p){ @@ -179,32 +175,20 @@ int persist__chunk_base_msg_read_v56(FILE *db_fptr, struct P_base_msg *chunk, ui if(chunk->F.source_id_len){ rc = persist__read_string_len(db_fptr, &chunk->source.id, chunk->F.source_id_len); - if(rc){ - return rc; - } + if(rc) goto error; } if(chunk->F.source_username_len){ rc = persist__read_string_len(db_fptr, &chunk->source.username, chunk->F.source_username_len); - if(rc){ - mosquitto__FREE(chunk->source.id); - return rc; - } + if(rc) goto error; } rc = persist__read_string_len(db_fptr, &chunk->topic, chunk->F.topic_len); - if(rc){ - mosquitto__FREE(chunk->source.id); - mosquitto__FREE(chunk->source.username); - return rc; - } + if(rc) goto error; if(chunk->F.payloadlen > 0){ chunk->payload = mosquitto__malloc(chunk->F.payloadlen+1); if(chunk->payload == NULL){ - mosquitto__FREE(chunk->source.id); - mosquitto__FREE(chunk->source.username); - mosquitto__FREE(chunk->topic); - log__printf(NULL, MOSQ_LOG_ERR, "Error: Out of memory."); - return MOSQ_ERR_NOMEM; + rc = MOSQ_ERR_NOMEM; + goto error; } read_e(db_fptr, chunk->payload, chunk->F.payloadlen); /* Ensure zero terminated regardless of contents */ @@ -215,31 +199,26 @@ int persist__chunk_base_msg_read_v56(FILE *db_fptr, struct P_base_msg *chunk, ui prop_packet.remaining_length = length; prop_packet.payload = mosquitto__malloc(length); if(!prop_packet.payload){ - mosquitto__FREE(chunk->source.id); - mosquitto__FREE(chunk->source.username); - mosquitto__FREE(chunk->topic); - return MOSQ_ERR_NOMEM; + rc = MOSQ_ERR_NOMEM; + goto error; } read_e(db_fptr, prop_packet.payload, length); rc = property__read_all(CMD_PUBLISH, &prop_packet, &properties); mosquitto__FREE(prop_packet.payload); if(rc){ - mosquitto__FREE(chunk->source.id); - mosquitto__FREE(chunk->source.username); - mosquitto__FREE(chunk->topic); - return rc; + rc = MOSQ_ERR_NOMEM; + goto error; } } chunk->properties = properties; return MOSQ_ERR_SUCCESS; error: - log__printf(NULL, MOSQ_LOG_ERR, "Error: %s.", strerror(errno)); mosquitto__FREE(chunk->source.id); mosquitto__FREE(chunk->source.username); mosquitto__FREE(chunk->topic); mosquitto__FREE(prop_packet.payload); - return 1; + return rc; } @@ -255,7 +234,7 @@ int persist__chunk_retain_read_v56(FILE *db_fptr, struct P_retain *chunk) int persist__chunk_sub_read_v56(FILE *db_fptr, struct P_sub *chunk) { - int rc; + int rc = MOSQ_ERR_SUCCESS; read_e(db_fptr, &chunk->F, sizeof(struct PF_sub)); chunk->F.identifier = ntohl(chunk->F.identifier); @@ -263,19 +242,15 @@ int persist__chunk_sub_read_v56(FILE *db_fptr, struct P_sub *chunk) chunk->F.topic_len = ntohs(chunk->F.topic_len); rc = persist__read_string_len(db_fptr, &chunk->client_id, chunk->F.id_len); - if(rc){ - return rc; - } + if(rc) goto error; + rc = persist__read_string_len(db_fptr, &chunk->topic, chunk->F.topic_len); - if(rc){ - mosquitto__FREE(chunk->client_id); - return rc; - } + if(rc) goto error; return MOSQ_ERR_SUCCESS; error: - log__printf(NULL, MOSQ_LOG_ERR, "Error: %s.", strerror(errno)); - return 1; + mosquitto__FREE(chunk->client_id); + return rc; } #endif