From 86344230a6bb79b95880769fbee4d859583c9ac4 Mon Sep 17 00:00:00 2001 From: Test_User Date: Wed, 24 Jul 2024 18:22:32 -0400 Subject: Fix some issues in inspircd3 protocol support, and the parts of inspircd4 protocol copied from it --- protocols/inspircd4.c | 22 +++++++++++++++++----- 1 file changed, 17 insertions(+), 5 deletions(-) (limited to 'protocols/inspircd4.c') diff --git a/protocols/inspircd4.c b/protocols/inspircd4.c index ff807c7..39107d5 100644 --- a/protocols/inspircd4.c +++ b/protocols/inspircd4.c @@ -913,8 +913,10 @@ void inspircd4_protocol_handle_unlink_server(struct string from, struct server_i int inspircd4_protocol_handle_new_user(struct string from, struct user_info *info) { struct server_info *server = get_table_index(server_list, info->server); - if (STRING_EQ(server->sid, SID) || server->protocol != INSPIRCD4_PROTOCOL) + if (STRING_EQ(server->sid, SID) || server->protocol != INSPIRCD4_PROTOCOL) { + info->protocol_specific[INSPIRCD4_PROTOCOL] = 0; return 0; + } struct inspircd4_protocol_specific_user *prot_info; prot_info = malloc(sizeof(*prot_info)); @@ -939,6 +941,11 @@ void inspircd4_protocol_handle_remove_user(struct string from, struct user_info return; struct inspircd4_protocol_specific_user *prot_info = info->protocol_specific[INSPIRCD4_PROTOCOL]; + while (prot_info->memberships.len > 0) { + struct inspircd4_protocol_member_id *mid = remove_table_index(&(prot_info->memberships), prot_info->memberships.array[0].name); + free(mid->id_str.data); + free(mid); + } free(prot_info->memberships.array); free(prot_info); @@ -1692,10 +1699,8 @@ int inspircd4_protocol_handle_fjoin(struct string source, size_t argc, struct st uid.len = (size_t)(&(argv[arg_i].data[i]) - uid.data); users[n] = get_table_index(user_list, uid); - if (!users[n]) { // Maybe KILLed or smth - n--; + if (!users[n] || !users[n]->protocol_specific[INSPIRCD3_PROTOCOL]) // TODO: Check that it's coming the right way too user_count--; - } i++; @@ -1705,6 +1710,11 @@ int inspircd4_protocol_handle_fjoin(struct string source, size_t argc, struct st while (i < argv[arg_i].len && argv[arg_i].data[i] != ' ') i++; + if (!users[n] || !users[n]->protocol_specific[INSPIRCD3_PROTOCOL]) { + n--; + continue; + } + mid.len = (size_t)(&(argv[arg_i].data[i]) - mid.data); if (mid.len == 0) mid = STRING("0"); @@ -1735,8 +1745,10 @@ int inspircd4_protocol_handle_fjoin(struct string source, size_t argc, struct st } for (size_t i = 0; i < user_count; i++) { - if (members[user_count + i]) + if (members[user_count + i]) { free(members[user_count + i]->id_str.data); + free(members[user_count + i]); + } } struct channel_info *channel = get_table_index(channel_list, argv[0]); -- cgit v1.2.3