2
0
mirror of https://github.com/ars3niy/tdlib-purple synced 2025-09-04 07:55:10 +00:00

Prevent a crash when buddy alias is NULL due to funny namey

This commit is contained in:
Arseniy Lartsev
2020-07-02 10:00:23 +02:00
parent d2346edb56
commit 43ef8db254
5 changed files with 44 additions and 16 deletions

View File

@@ -234,16 +234,7 @@ void updatePrivateChat(TdAccountData &account, const td::td_api::chat &chat, con
PURPLE_MESSAGE_SYSTEM, time(NULL));
}
} else {
const char *oldName = purple_buddy_get_alias_only(buddy);
if (chat.title_ != oldName) {
purple_debug_misc(config::pluginId, "Renaming buddy %s '%s' to '%s'\n",
purpleUserName.c_str(), oldName, chat.title_.c_str());
/*PurpleGroup *group = purple_buddy_get_group(buddy);
purple_blist_remove_buddy(buddy);
buddy = purple_buddy_new(m_account, purpleUserName.c_str(), chat.title_.c_str());
purple_blist_add_buddy(buddy, NULL, group, NULL);*/
purple_blist_alias_buddy(buddy, chat.title_.c_str());
}
const char *oldPhotoIdStr = purple_blist_node_get_string(PURPLE_BLIST_NODE(buddy), BuddyOptions::ProfilePhotoId);
int64_t oldPhotoId = 0;

View File

@@ -208,13 +208,24 @@ void purple_blist_remove_buddy(PurpleBuddy *buddy)
purple_buddy_destroy(buddy);
}
static gboolean
purple_strings_are_different(const char *one, const char *two)
{
return !((one && two && g_utf8_collate(one, two) == 0) ||
((one == NULL || *one == '\0') && (two == NULL || *two == '\0')));
}
void purple_blist_alias_buddy(PurpleBuddy *buddy, const char *alias)
{
ASSERT_NE(nullptr, buddy);
// Similar to real libpurple
if (purple_strings_are_different(buddy->alias, alias)) {
free(buddy->alias);
buddy->alias = strdup(alias);
EVENT(AliasBuddyEvent, buddy->name, alias);
}
}
static char *getChatName(const PurpleChat *chat)
{
@@ -288,7 +299,7 @@ PurpleBuddy *purple_buddy_new(PurpleAccount *account, const char *name, const ch
buddy->account = account;
buddy->name = strdup(name);
buddy->alias = strdup(alias);
buddy->alias = alias ? strdup(alias) : NULL;
buddy->node.parent = NULL;
newNode(buddy->node, PURPLE_BLIST_BUDDY_NODE);

View File

@@ -374,6 +374,7 @@ TEST_F(LoginTest, BuddyRenamedByServer)
tgl.update(make_object<updateChatTitle>(chatIds[0], "New Name"));
prpl.verifyEvents(AliasBuddyEvent(purpleUserName(0), "New Name"));
object_ptr<updateUser> updateUser = standardUpdateUser(0);
updateUser->user_->first_name_ = "New";
updateUser->user_->last_name_ = "Name";

View File

@@ -1044,3 +1044,24 @@ TEST_F(PrivateChatTest, WriteToUnknownUser)
)
);
}
TEST_F(PrivateChatTest, BuddyWithNullAlias)
{
PurpleBuddy *buddy = purple_buddy_new(account, purpleUserName(0).c_str(), NULL);
purple_blist_add_buddy(buddy, NULL, &standardPurpleGroup, NULL);
prpl.discardEvents();
login(
{standardUpdateUser(0), standardPrivateChat(0), makeUpdateChatListMain(chatIds[0])},
make_object<users>(1, std::vector<int32_t>(1, userIds[0])),
make_object<chats>(std::vector<int64_t>(1, chatIds[0])),
{}, {},
{
std::make_unique<ConnectionSetStateEvent>(connection, PURPLE_CONNECTED),
std::make_unique<AliasBuddyEvent>(purpleUserName(0), userFirstNames[0] + " " + userLastNames[0]),
std::make_unique<UserStatusEvent>(account, purpleUserName(0), PURPLE_STATUS_OFFLINE),
std::make_unique<AccountSetAliasEvent>(account, selfFirstName + " " + selfLastName),
std::make_unique<ShowAccountEvent>(account)
}
);
}

View File

@@ -132,10 +132,14 @@ struct AddBuddyEvent: PurpleEvent {
PurpleGroup *group;
PurpleBlistNode *node;
AddBuddyEvent(const std::string &username, const char *alias, PurpleAccount *account,
PurpleContact *contact, PurpleGroup *group, PurpleBlistNode *node)
: PurpleEvent(PurpleEventType::AddBuddy), username(username), alias(alias ? alias : ""),
account(account), contact(contact), group(group), node(node) {}
AddBuddyEvent(const std::string &username, const std::string &alias, PurpleAccount *account,
PurpleContact *contact, PurpleGroup *group, PurpleBlistNode *node)
: PurpleEvent(PurpleEventType::AddBuddy), username(username), alias(alias), account(account),
contact(contact), group(group), node(node) {}
: AddBuddyEvent(username, alias.c_str(), account, contact, group, node) {}
};
struct AddChatEvent: PurpleEvent {