mirror of
https://github.com/ars3niy/tdlib-purple
synced 2025-09-03 23:45:08 +00:00
Prevent a crash when buddy alias is NULL due to funny namey
This commit is contained in:
@@ -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());
|
||||
}
|
||||
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;
|
||||
|
@@ -208,12 +208,23 @@ 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);
|
||||
free(buddy->alias);
|
||||
buddy->alias = strdup(alias);
|
||||
EVENT(AliasBuddyEvent, buddy->name, alias);
|
||||
|
||||
// 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);
|
||||
|
||||
|
@@ -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";
|
||||
|
@@ -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)
|
||||
}
|
||||
);
|
||||
}
|
||||
|
@@ -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 {
|
||||
|
Reference in New Issue
Block a user