From f8beb38c5e813ace4799cef75232f6e5c6b3a67b Mon Sep 17 00:00:00 2001 From: TheJackiMonster Date: Mon, 29 Nov 2021 12:43:25 +0100 Subject: -fix messenger load-, store-operations and uninitialized memory Signed-off-by: TheJackiMonster --- src/messenger/gnunet-service-messenger_handle.c | 8 ++- src/messenger/gnunet-service-messenger_member.c | 4 ++ .../gnunet-service-messenger_member_session.c | 6 ++ .../gnunet-service-messenger_message_store.c | 67 +++++++++++++--------- src/messenger/gnunet-service-messenger_operation.c | 4 ++ .../gnunet-service-messenger_operation_store.c | 34 +++++------ src/messenger/gnunet-service-messenger_room.c | 4 -- src/messenger/messenger_api.c | 2 +- 8 files changed, 79 insertions(+), 50 deletions(-) (limited to 'src/messenger') diff --git a/src/messenger/gnunet-service-messenger_handle.c b/src/messenger/gnunet-service-messenger_handle.c index fa6830697..341bb7251 100644 --- a/src/messenger/gnunet-service-messenger_handle.c +++ b/src/messenger/gnunet-service-messenger_handle.c @@ -598,6 +598,11 @@ callback_scan_for_rooms (void *cls, { struct GNUNET_MESSENGER_SrvHandle *handle = cls; + if ((strlen(filename) <= 4) || (0 != strcmp(filename + strlen(filename) - 4, ".cfg"))) + return GNUNET_OK; + + GNUNET_log(GNUNET_ERROR_TYPE_DEBUG, "Load room configuration of handle: %s\n", filename); + struct GNUNET_CONFIGURATION_Handle *cfg = GNUNET_CONFIGURATION_create (); if ((GNUNET_YES == GNUNET_DISK_file_test (filename)) && (GNUNET_OK == GNUNET_CONFIGURATION_parse (cfg, filename))) @@ -649,9 +654,10 @@ iterate_save_rooms (void *cls, char *filename; GNUNET_asprintf (&filename, "%s%s%c%s.cfg", id_dir, "rooms", DIR_SEPARATOR, GNUNET_h2s (key)); - GNUNET_free(id_dir); + GNUNET_log(GNUNET_ERROR_TYPE_DEBUG, "Save room configuration of handle: %s\n", filename); + struct GNUNET_CONFIGURATION_Handle *cfg = GNUNET_CONFIGURATION_create (); char *key_data = GNUNET_STRINGS_data_to_string_alloc (key, sizeof(*key)); diff --git a/src/messenger/gnunet-service-messenger_member.c b/src/messenger/gnunet-service-messenger_member.c index def57aef9..976b68fe6 100644 --- a/src/messenger/gnunet-service-messenger_member.c +++ b/src/messenger/gnunet-service-messenger_member.c @@ -112,6 +112,8 @@ load_member (struct GNUNET_MESSENGER_MemberStore *store, if (GNUNET_YES != GNUNET_DISK_file_test (config_file)) goto free_config; + GNUNET_log(GNUNET_ERROR_TYPE_DEBUG, "Load member configuration: %s\n", config_file); + struct GNUNET_CONFIGURATION_Handle *cfg = GNUNET_CONFIGURATION_create (); if (GNUNET_OK == GNUNET_CONFIGURATION_parse (cfg, config_file)) @@ -205,6 +207,8 @@ save_member (struct GNUNET_MESSENGER_Member *member, char *config_file; GNUNET_asprintf (&config_file, "%s%s", directory, "member.cfg"); + GNUNET_log(GNUNET_ERROR_TYPE_DEBUG, "Save member configuration: %s\n", config_file); + struct GNUNET_CONFIGURATION_Handle *cfg = GNUNET_CONFIGURATION_create (); char *id_data = GNUNET_STRINGS_data_to_string_alloc (&(member->id), sizeof(member->id)); diff --git a/src/messenger/gnunet-service-messenger_member_session.c b/src/messenger/gnunet-service-messenger_member_session.c index 03736941f..846dbbe2b 100644 --- a/src/messenger/gnunet-service-messenger_member_session.c +++ b/src/messenger/gnunet-service-messenger_member_session.c @@ -518,6 +518,8 @@ load_member_session (struct GNUNET_MESSENGER_Member *member, if (GNUNET_YES != GNUNET_DISK_file_test (config_file)) goto free_config; + GNUNET_log(GNUNET_ERROR_TYPE_DEBUG, "Load session configuration of member: %s\n", config_file); + struct GNUNET_CONFIGURATION_Handle *cfg = GNUNET_CONFIGURATION_create (); if (GNUNET_OK == GNUNET_CONFIGURATION_parse (cfg, config_file)) @@ -605,6 +607,8 @@ load_member_session_next (struct GNUNET_MESSENGER_MemberSession *session, if (GNUNET_YES != GNUNET_DISK_file_test (config_file)) goto free_config; + GNUNET_log(GNUNET_ERROR_TYPE_DEBUG, "Load next session configuration of member: %s\n", config_file); + struct GNUNET_CONFIGURATION_Handle *cfg = GNUNET_CONFIGURATION_create (); if (GNUNET_OK == GNUNET_CONFIGURATION_parse (cfg, config_file)) @@ -695,6 +699,8 @@ save_member_session (struct GNUNET_MESSENGER_MemberSession *session, char *config_file; GNUNET_asprintf (&config_file, "%s%s", directory, "session.cfg"); + GNUNET_log(GNUNET_ERROR_TYPE_DEBUG, "Save session configuration of member: %s\n", config_file); + struct GNUNET_CONFIGURATION_Handle *cfg = GNUNET_CONFIGURATION_create (); char *key_data = GNUNET_IDENTITY_public_key_to_string(get_member_session_public_key(session)); diff --git a/src/messenger/gnunet-service-messenger_message_store.c b/src/messenger/gnunet-service-messenger_message_store.c index ce20ac924..ddad266ad 100644 --- a/src/messenger/gnunet-service-messenger_message_store.c +++ b/src/messenger/gnunet-service-messenger_message_store.c @@ -104,6 +104,12 @@ struct GNUNET_MESSENGER_MessageEntryStorage struct GNUNET_MESSENGER_MessageEntry entry; }; +#define load_message_store_attribute_failed(file, attribute) \ + sizeof(attribute) != GNUNET_DISK_file_read(file, &(attribute), sizeof(attribute)) + +#define save_message_store_attribute_failed(file, attribute) \ + sizeof(attribute) != GNUNET_DISK_file_write(file, &(attribute), sizeof(attribute)) + static void load_message_store_entries (struct GNUNET_MESSENGER_MessageStore *store, const char *filename) @@ -118,31 +124,34 @@ load_message_store_entries (struct GNUNET_MESSENGER_MessageStore *store, struct GNUNET_MESSENGER_MessageEntryStorage storage; struct GNUNET_MESSENGER_MessageEntry *entry; + memset(&storage, 0, sizeof(storage)); + do { + entry = NULL; + + if ((load_message_store_attribute_failed(entries, storage.hash)) || + (load_message_store_attribute_failed(entries, storage.entry.offset)) || + (load_message_store_attribute_failed(entries, storage.entry.length))) + break; + entry = GNUNET_new(struct GNUNET_MESSENGER_MessageEntry); - if (GNUNET_DISK_file_read (entries, &storage, sizeof(storage)) == sizeof(storage)) - { - GNUNET_memcpy(entry, &(storage.entry), sizeof(*entry)); - - if ((GNUNET_YES == GNUNET_CONTAINER_multihashmap_contains (store->entries, &(storage.hash))) || - (GNUNET_OK != GNUNET_CONTAINER_multihashmap_put (store->entries, &(storage.hash), entry, - GNUNET_CONTAINER_MULTIHASHMAPOPTION_UNIQUE_FAST))) - { - store->rewrite_entries = GNUNET_YES; - GNUNET_free(entry); - } - } - else - { - GNUNET_free(entry); + GNUNET_memcpy(entry, &(storage.entry), sizeof(*entry)); - entry = NULL; + if ((GNUNET_YES == GNUNET_CONTAINER_multihashmap_contains (store->entries, &(storage.hash))) || + (GNUNET_OK != GNUNET_CONTAINER_multihashmap_put (store->entries, &(storage.hash), entry, + GNUNET_CONTAINER_MULTIHASHMAPOPTION_UNIQUE_FAST))) + { + store->rewrite_entries = GNUNET_YES; + break; } } while (entry); + if (entry) + GNUNET_free(entry); + GNUNET_DISK_file_close (entries); } @@ -164,17 +173,19 @@ load_message_store_links (struct GNUNET_MESSENGER_MessageStore *store, return; struct GNUNET_MESSENGER_MessageLinkStorage storage; - struct GNUNET_MESSENGER_MessageLink *link = NULL; + struct GNUNET_MESSENGER_MessageLink *link; memset(&storage, 0, sizeof(storage)); do { - if ((sizeof(storage.hash) != GNUNET_DISK_file_read (entries, &(storage.hash), sizeof(storage.hash))) || - (sizeof(storage.link.multiple) != GNUNET_DISK_file_read (entries, &(storage.link.multiple), sizeof(storage.link.multiple))) || - (sizeof(storage.link.first) != GNUNET_DISK_file_read (entries, &(storage.link.first), sizeof(storage.link.first))) || + link = NULL; + + if ((load_message_store_attribute_failed(entries, storage.hash)) || + (load_message_store_attribute_failed(entries, storage.link.multiple)) || + (load_message_store_attribute_failed(entries, storage.link.first)) || ((GNUNET_YES == storage.link.multiple) && - (sizeof(storage.link.second) != GNUNET_DISK_file_read (entries, &(storage.link.second), sizeof(storage.link.second))))) + (load_message_store_attribute_failed(entries, storage.link.second)))) break; link = GNUNET_new(struct GNUNET_MESSENGER_MessageLink); @@ -250,10 +261,9 @@ iterate_save_entries (void *cls, struct GNUNET_MESSENGER_MessageEntryStorage storage; - GNUNET_memcpy(&(storage.hash), key, sizeof(storage.hash)); - GNUNET_memcpy(&(storage.entry), entry, sizeof(*entry)); - - GNUNET_DISK_file_write (save->storage, &storage, sizeof(storage)); + GNUNET_DISK_file_write (save->storage, key, sizeof(*key)); + GNUNET_DISK_file_write (save->storage, &(entry->offset), sizeof(entry->offset)); + GNUNET_DISK_file_write (save->storage, &(entry->length), sizeof(entry->length)); return GNUNET_YES; } @@ -276,8 +286,10 @@ iterate_save_messages (void *cls, storage.entry.length = get_message_size (message, GNUNET_YES); storage.entry.offset = GNUNET_DISK_file_seek (save->store->storage_messages, 0, GNUNET_DISK_SEEK_END); - if ((GNUNET_SYSERR == storage.entry.offset) || (sizeof(storage) - != GNUNET_DISK_file_write (save->storage, &storage, sizeof(storage)))) + if ((GNUNET_SYSERR == storage.entry.offset) || + (save_message_store_attribute_failed(save->storage, storage.hash)) || + (save_message_store_attribute_failed(save->storage, storage.entry.offset)) || + (save_message_store_attribute_failed(save->storage, storage.entry.length))) return GNUNET_YES; char *buffer = GNUNET_malloc(storage.entry.length); @@ -287,7 +299,6 @@ iterate_save_messages (void *cls, GNUNET_DISK_file_write (save->store->storage_messages, buffer, storage.entry.length); GNUNET_free(buffer); - return GNUNET_YES; } diff --git a/src/messenger/gnunet-service-messenger_operation.c b/src/messenger/gnunet-service-messenger_operation.c index a8744e577..2b92d0c1d 100644 --- a/src/messenger/gnunet-service-messenger_operation.c +++ b/src/messenger/gnunet-service-messenger_operation.c @@ -63,6 +63,8 @@ load_operation (struct GNUNET_MESSENGER_OperationStore *store, { GNUNET_assert((store) && (path)); + GNUNET_log(GNUNET_ERROR_TYPE_DEBUG, "Load operation configuration: %s\n", path); + struct GNUNET_CONFIGURATION_Handle *cfg = GNUNET_CONFIGURATION_create (); struct GNUNET_MESSENGER_Operation* op = NULL; @@ -124,6 +126,8 @@ save_operation (const struct GNUNET_MESSENGER_Operation *op, { GNUNET_assert((path) && (op)); + GNUNET_log(GNUNET_ERROR_TYPE_DEBUG, "Save operation configuration: %s\n", path); + struct GNUNET_CONFIGURATION_Handle *cfg = GNUNET_CONFIGURATION_create (); char *hash_data; diff --git a/src/messenger/gnunet-service-messenger_operation_store.c b/src/messenger/gnunet-service-messenger_operation_store.c index 4f8419daa..276f0b92b 100644 --- a/src/messenger/gnunet-service-messenger_operation_store.c +++ b/src/messenger/gnunet-service-messenger_operation_store.c @@ -65,23 +65,20 @@ callback_scan_for_operations (void *cls, { struct GNUNET_MESSENGER_OperationStore *store = cls; - if (GNUNET_YES == GNUNET_DISK_file_test (filename)) - { - char *path; - - GNUNET_asprintf (&path, "%s%c", filename, DIR_SEPARATOR); + if (GNUNET_YES != GNUNET_DISK_file_test (filename)) + return GNUNET_OK; - struct GNUNET_MESSENGER_Operation *op = load_operation(store, path); + if ((strlen(filename) <= 4) || (0 != strcmp(filename + strlen(filename) - 4, ".cfg"))) + return GNUNET_OK; - if ((op) && (GNUNET_OK != GNUNET_CONTAINER_multihashmap_put( - store->operations, - &(op->hash), op, - GNUNET_CONTAINER_MULTIHASHMAPOPTION_UNIQUE_FAST))) - { - destroy_operation(op); - } + struct GNUNET_MESSENGER_Operation *op = load_operation(store, filename); - GNUNET_free(path); + if ((op) && (GNUNET_OK != GNUNET_CONTAINER_multihashmap_put( + store->operations, + &(op->hash), op, + GNUNET_CONTAINER_MULTIHASHMAPOPTION_UNIQUE_FAST))) + { + destroy_operation(op); } return GNUNET_OK; @@ -93,8 +90,13 @@ load_operation_store (struct GNUNET_MESSENGER_OperationStore *store, { GNUNET_assert ((store) && (directory)); - if (GNUNET_OK == GNUNET_DISK_directory_test (directory, GNUNET_YES)) - GNUNET_DISK_directory_scan (directory, callback_scan_for_operations, store); + char* load_dir; + GNUNET_asprintf (&load_dir, "%s%s%c", directory, "operations", DIR_SEPARATOR); + + if (GNUNET_OK == GNUNET_DISK_directory_test (load_dir, GNUNET_YES)) + GNUNET_DISK_directory_scan (load_dir, callback_scan_for_operations, store); + + GNUNET_free(load_dir); } static int diff --git a/src/messenger/gnunet-service-messenger_room.c b/src/messenger/gnunet-service-messenger_room.c index d34665511..7f2fd0ca6 100644 --- a/src/messenger/gnunet-service-messenger_room.c +++ b/src/messenger/gnunet-service-messenger_room.c @@ -1188,11 +1188,7 @@ load_room (struct GNUNET_MESSENGER_SrvRoom *room) load_list_tunnels(&(room->basement), basement_file); GNUNET_free(basement_file); - char *last_messages_file; - GNUNET_asprintf (&last_messages_file, "%s%s", room_dir, "last_messages.list"); - load_message_state(&(room->state), room_dir); - GNUNET_free (last_messages_file); } GNUNET_free(room_dir); diff --git a/src/messenger/messenger_api.c b/src/messenger/messenger_api.c index 2db841315..a37b1b10b 100644 --- a/src/messenger/messenger_api.c +++ b/src/messenger/messenger_api.c @@ -261,7 +261,7 @@ handle_recv_message (void *cls, handle->msg_callback (handle->msg_cls, room, contact, stored_message, hash, flags); } else - GNUNET_log(GNUNET_ERROR_TYPE_ERROR, "Room not found\n"); + GNUNET_log(GNUNET_ERROR_TYPE_DEBUG, "Unknown room for this client: %s\n", GNUNET_h2s (key)); cleanup_message(&message); } -- cgit v1.2.3