mirror of
https://github.com/ars3niy/tdlib-purple
synced 2025-09-05 00:25:24 +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));
|
PURPLE_MESSAGE_SYSTEM, time(NULL));
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
const char *oldName = purple_buddy_get_alias_only(buddy);
|
purple_blist_alias_buddy(buddy, chat.title_.c_str());
|
||||||
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);
|
const char *oldPhotoIdStr = purple_blist_node_get_string(PURPLE_BLIST_NODE(buddy), BuddyOptions::ProfilePhotoId);
|
||||||
int64_t oldPhotoId = 0;
|
int64_t oldPhotoId = 0;
|
||||||
|
@@ -208,12 +208,23 @@ void purple_blist_remove_buddy(PurpleBuddy *buddy)
|
|||||||
purple_buddy_destroy(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)
|
void purple_blist_alias_buddy(PurpleBuddy *buddy, const char *alias)
|
||||||
{
|
{
|
||||||
ASSERT_NE(nullptr, buddy);
|
ASSERT_NE(nullptr, buddy);
|
||||||
free(buddy->alias);
|
|
||||||
buddy->alias = strdup(alias);
|
// Similar to real libpurple
|
||||||
EVENT(AliasBuddyEvent, buddy->name, alias);
|
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)
|
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->account = account;
|
||||||
buddy->name = strdup(name);
|
buddy->name = strdup(name);
|
||||||
buddy->alias = strdup(alias);
|
buddy->alias = alias ? strdup(alias) : NULL;
|
||||||
buddy->node.parent = NULL;
|
buddy->node.parent = NULL;
|
||||||
newNode(buddy->node, PURPLE_BLIST_BUDDY_NODE);
|
newNode(buddy->node, PURPLE_BLIST_BUDDY_NODE);
|
||||||
|
|
||||||
|
@@ -374,6 +374,7 @@ TEST_F(LoginTest, BuddyRenamedByServer)
|
|||||||
|
|
||||||
tgl.update(make_object<updateChatTitle>(chatIds[0], "New Name"));
|
tgl.update(make_object<updateChatTitle>(chatIds[0], "New Name"));
|
||||||
prpl.verifyEvents(AliasBuddyEvent(purpleUserName(0), "New Name"));
|
prpl.verifyEvents(AliasBuddyEvent(purpleUserName(0), "New Name"));
|
||||||
|
|
||||||
object_ptr<updateUser> updateUser = standardUpdateUser(0);
|
object_ptr<updateUser> updateUser = standardUpdateUser(0);
|
||||||
updateUser->user_->first_name_ = "New";
|
updateUser->user_->first_name_ = "New";
|
||||||
updateUser->user_->last_name_ = "Name";
|
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;
|
PurpleGroup *group;
|
||||||
PurpleBlistNode *node;
|
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,
|
AddBuddyEvent(const std::string &username, const std::string &alias, PurpleAccount *account,
|
||||||
PurpleContact *contact, PurpleGroup *group, PurpleBlistNode *node)
|
PurpleContact *contact, PurpleGroup *group, PurpleBlistNode *node)
|
||||||
: PurpleEvent(PurpleEventType::AddBuddy), username(username), alias(alias), account(account),
|
: AddBuddyEvent(username, alias.c_str(), account, contact, group, node) {}
|
||||||
contact(contact), group(group), node(node) {}
|
|
||||||
};
|
};
|
||||||
|
|
||||||
struct AddChatEvent: PurpleEvent {
|
struct AddChatEvent: PurpleEvent {
|
||||||
|
Reference in New Issue
Block a user