From 165005742c1c6a5b0b6d037c9e83cbe4a18a3092 Mon Sep 17 00:00:00 2001 From: "A. Wilcox" Date: Sun, 29 May 2022 03:37:26 -0500 Subject: [PATCH] persist: Fix ID storage on big-endian systems Signed-off-by: A. Wilcox --- src/persist_read.c | 3 ++- src/persist_read_v234.c | 5 ++++- src/persist_read_v5.c | 4 ++++ src/persist_write.c | 4 ++-- src/persist_write_v5.c | 4 ++++ 5 files changed, 16 insertions(+), 4 deletions(-) diff --git a/src/persist_read.c b/src/persist_read.c index 5e7be454..e2b4ecb3 100644 --- a/src/persist_read.c +++ b/src/persist_read.c @@ -24,6 +24,7 @@ Contributors: #include #endif #include +#include #include #include #include @@ -480,7 +481,7 @@ int persist__restore(void) fclose(fptr); return 1; } - db.last_db_id = cfg_chunk.last_db_id; + db.last_db_id = le64toh(cfg_chunk.last_db_id); break; case DB_CHUNK_MSG_STORE: diff --git a/src/persist_read_v234.c b/src/persist_read_v234.c index 7460c309..701d88d9 100644 --- a/src/persist_read_v234.c +++ b/src/persist_read_v234.c @@ -24,6 +24,7 @@ Contributors: #include #endif +#include #include #include #include #include @@ -107,6 +108,7 @@ int persist__chunk_client_msg_read_v234(FILE *db_fptr, struct P_client_msg *chun } read_e(db_fptr, &chunk->F.store_id, sizeof(dbid_t)); + chunk->F.store_id = le64toh(chunk->F.store_id); read_e(db_fptr, &i16temp, sizeof(uint16_t)); chunk->F.mid = ntohs(i16temp); @@ -136,6 +138,7 @@ int persist__chunk_msg_store_read_v234(FILE *db_fptr, struct P_msg_store *chunk, char *err; read_e(db_fptr, &chunk->F.store_id, sizeof(dbid_t)); + chunk->F.store_id = le64toh(chunk->F.store_id); rc = persist__read_string(db_fptr, &chunk->source.id); if(rc){ @@ -204,7 +207,7 @@ int persist__chunk_retain_read_v234(FILE *db_fptr, struct P_retain *chunk) log__printf(NULL, MOSQ_LOG_ERR, "Error: %s.", err); return 1; } - chunk->F.store_id = i64temp; + chunk->F.store_id = le64toh(i64temp); return MOSQ_ERR_SUCCESS; } diff --git a/src/persist_read_v5.c b/src/persist_read_v5.c index abc9a580..12d3e801 100644 --- a/src/persist_read_v5.c +++ b/src/persist_read_v5.c @@ -24,6 +24,7 @@ Contributors: #include #endif +#include #include #include #include #include @@ -115,6 +116,7 @@ int persist__chunk_client_msg_read_v56(FILE *db_fptr, struct P_client_msg *chunk read_e(db_fptr, &chunk->F, sizeof(struct PF_client_msg)); chunk->F.mid = ntohs(chunk->F.mid); chunk->F.id_len = ntohs(chunk->F.id_len); + chunk->F.store_id = le64toh(chunk->F.store_id); length -= (uint32_t)(sizeof(struct PF_client_msg) + chunk->F.id_len); @@ -164,6 +166,7 @@ int persist__chunk_msg_store_read_v56(FILE *db_fptr, struct P_msg_store *chunk, chunk->F.source_username_len = ntohs(chunk->F.source_username_len); chunk->F.topic_len = ntohs(chunk->F.topic_len); chunk->F.source_port = ntohs(chunk->F.source_port); + chunk->F.store_id = le64toh(chunk->F.store_id); length -= (uint32_t)(sizeof(struct PF_msg_store) + chunk->F.payloadlen + chunk->F.source_id_len + chunk->F.source_username_len + chunk->F.topic_len); @@ -245,6 +248,7 @@ int persist__chunk_retain_read_v56(FILE *db_fptr, struct P_retain *chunk) log__printf(NULL, MOSQ_LOG_ERR, "Error: %s.", strerror(errno)); return 1; } + chunk->F.store_id = le64toh(chunk->F.store_id); return MOSQ_ERR_SUCCESS; } diff --git a/src/persist_write.c b/src/persist_write.c index ccfbc29c..93a32639 100644 --- a/src/persist_write.c +++ b/src/persist_write.c @@ -291,7 +291,7 @@ static int persist__retain_save(FILE *db_fptr, struct mosquitto__retainhier *nod /* Don't save $SYS messages. */ memset(&retain_chunk, 0, sizeof(struct P_retain)); - retain_chunk.F.store_id = node->retained->db_id; + retain_chunk.F.store_id = htole64(node->retained->db_id); rc = persist__chunk_retain_write_v6(db_fptr, &retain_chunk); if(rc){ return rc; @@ -385,7 +385,7 @@ int persist__backup(bool shutdown) write_e(db_fptr, &db_version_w, sizeof(uint32_t)); memset(&cfg_chunk, 0, sizeof(struct PF_cfg)); - cfg_chunk.last_db_id = db.last_db_id; + cfg_chunk.last_db_id = htole64(db.last_db_id); cfg_chunk.shutdown = shutdown; cfg_chunk.dbid_size = sizeof(dbid_t); if(persist__chunk_cfg_write_v6(db_fptr, &cfg_chunk)){ diff --git a/src/persist_write_v5.c b/src/persist_write_v5.c index 8c9f6c34..b9fb5a8e 100644 --- a/src/persist_write_v5.c +++ b/src/persist_write_v5.c @@ -24,6 +24,7 @@ Contributors: #include #endif +#include #include #include #include #include @@ -99,6 +100,7 @@ int persist__chunk_client_msg_write_v6(FILE *db_fptr, struct P_client_msg *chunk chunk->F.mid = htons(chunk->F.mid); chunk->F.id_len = htons(chunk->F.id_len); + chunk->F.store_id = htole64(chunk->F.store_id); header.chunk = htonl(DB_CHUNK_CLIENT_MSG); header.length = htonl((uint32_t)sizeof(struct PF_client_msg) + id_len + proplen); @@ -148,6 +150,7 @@ int persist__chunk_message_store_write_v6(FILE *db_fptr, struct P_msg_store *chu proplen += property__get_remaining_length(chunk->properties); } + chunk->F.store_id = htole64(chunk->F.store_id); chunk->F.payloadlen = htonl(chunk->F.payloadlen); chunk->F.source_mid = htons(chunk->F.source_mid); chunk->F.source_id_len = htons(chunk->F.source_id_len); @@ -205,6 +208,7 @@ int persist__chunk_retain_write_v6(FILE *db_fptr, struct P_retain *chunk) header.chunk = htonl(DB_CHUNK_RETAIN); header.length = htonl((uint32_t)sizeof(struct PF_retain)); + chunk->F.store_id = htole64(chunk->F.store_id); write_e(db_fptr, &header, sizeof(struct PF_header)); write_e(db_fptr, &chunk->F, sizeof(struct PF_retain)); -- 2.35.1 --- mosquitto-2.0.22/src/persist_write.c.old 2025-08-12 10:10:49.824308365 +0000 +++ mosquitto-2.0.22/src/persist_write.c 2025-08-12 10:11:42.938672118 +0000