aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTest_User <hax@andrewyu.org>2024-07-24 18:22:32 -0400
committerTest_User <hax@andrewyu.org>2024-07-24 18:34:05 -0400
commit86344230a6bb79b95880769fbee4d859583c9ac4 (patch)
tree0218358b7d8a9f0303894551408209bc41d6e16c
parent3d39ab0475b4c55bcf63dabde86620044d5d5d7b (diff)
downloadhaxircd-86344230a6bb79b95880769fbee4d859583c9ac4.tar.gz
haxircd-86344230a6bb79b95880769fbee4d859583c9ac4.zip
Fix some issues in inspircd3 protocol support, and the parts of inspircd4 protocol copied from it
-rw-r--r--.gitignore3
-rw-r--r--protocols/inspircd3.c22
-rw-r--r--protocols/inspircd4.c22
3 files changed, 36 insertions, 11 deletions
diff --git a/.gitignore b/.gitignore
index 8c2cd14..c85594e 100644
--- a/.gitignore
+++ b/.gitignore
@@ -3,7 +3,8 @@ config.c
*.so
.*.swp
HaxIRCd
-core
+core*
+vgcore*
.makeopts
output
*.db
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]);