diff options
author | Test_User <hax@andrewyu.org> | 2024-07-24 18:22:32 -0400 |
---|---|---|
committer | Test_User <hax@andrewyu.org> | 2024-07-24 18:34:05 -0400 |
commit | 86344230a6bb79b95880769fbee4d859583c9ac4 (patch) | |
tree | 0218358b7d8a9f0303894551408209bc41d6e16c /protocols | |
parent | 3d39ab0475b4c55bcf63dabde86620044d5d5d7b (diff) | |
download | haxircd-86344230a6bb79b95880769fbee4d859583c9ac4.tar.gz haxircd-86344230a6bb79b95880769fbee4d859583c9ac4.zip |
Fix some issues in inspircd3 protocol support, and the parts of inspircd4 protocol copied from it
Diffstat (limited to 'protocols')
-rw-r--r-- | protocols/inspircd3.c | 22 | ||||
-rw-r--r-- | protocols/inspircd4.c | 22 |
2 files changed, 34 insertions, 10 deletions
diff --git a/protocols/inspircd3.c b/protocols/inspircd3.c index 9d09831..c2f4952 100644 --- a/protocols/inspircd3.c +++ b/protocols/inspircd3.c @@ -910,8 +910,10 @@ void inspircd3_protocol_handle_unlink_server(struct string from, struct server_i int inspircd3_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 != INSPIRCD3_PROTOCOL) + if (STRING_EQ(server->sid, SID) || server->protocol != INSPIRCD3_PROTOCOL) { + info->protocol_specific[INSPIRCD3_PROTOCOL] = 0; return 0; + } struct inspircd3_protocol_specific_user *prot_info; prot_info = malloc(sizeof(*prot_info)); @@ -936,6 +938,11 @@ void inspircd3_protocol_handle_remove_user(struct string from, struct user_info return; struct inspircd3_protocol_specific_user *prot_info = info->protocol_specific[INSPIRCD3_PROTOCOL]; + while (prot_info->memberships.len > 0) { + struct inspircd3_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); @@ -1685,10 +1692,8 @@ int inspircd3_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++; @@ -1698,6 +1703,11 @@ int inspircd3_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"); @@ -1728,8 +1738,10 @@ int inspircd3_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]); 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]); |