From ecda7e67a5a4e91a4477b7100710606b06758c97 Mon Sep 17 00:00:00 2001 From: Sylvain Berfini Date: Tue, 10 May 2016 18:14:40 +0200 Subject: [PATCH] Fix too many unref crash in vcard tester --- coreapi/friend.c | 11 +++++++++++ coreapi/friendlist.c | 2 +- coreapi/presence.c | 4 ++-- coreapi/private.h | 1 + 4 files changed, 15 insertions(+), 3 deletions(-) diff --git a/coreapi/friend.c b/coreapi/friend.c index 2c3d876c1..7278f2c8a 100644 --- a/coreapi/friend.c +++ b/coreapi/friend.c @@ -814,6 +814,17 @@ LinphoneFriend *linphone_core_get_friend_by_ref_key(const LinphoneCore *lc, cons return lf; } +LinphoneFriend *linphone_core_find_friend_by_out_subscribe(const LinphoneCore *lc, SalOp *op) { + MSList *lists = lc->friends_lists; + LinphoneFriend *lf = NULL; + while (lists && !lf) { + LinphoneFriendList *list = (LinphoneFriendList *)lists->data; + lf = linphone_friend_list_find_friend_by_out_subscribe(list, op); + lists = ms_list_next(lists); + } + return lf; +} + #define key_compare(s1,s2) strcmp(s1,s2) LinphoneSubscribePolicy __policy_str_to_enum(const char* pol){ diff --git a/coreapi/friendlist.c b/coreapi/friendlist.c index b4ec73d19..08d8707c7 100644 --- a/coreapi/friendlist.c +++ b/coreapi/friendlist.c @@ -670,7 +670,7 @@ void linphone_friend_list_update_subscriptions(LinphoneFriendList *list, Linphon } else { ms_message("Friends list [%p] subscription update skipped since subscriptions not enabled yet", list); } - } else { + } else if (list->enable_subscriptions) { for (elem = list->friends; elem != NULL; elem = elem->next) { LinphoneFriend *lf = (LinphoneFriend *)elem->data; linphone_friend_update_subscribes(lf, cfg, only_when_registered); diff --git a/coreapi/presence.c b/coreapi/presence.c index 5d91b7ff3..e8d0b13f1 100644 --- a/coreapi/presence.c +++ b/coreapi/presence.c @@ -1889,10 +1889,10 @@ void linphone_notify_recv(LinphoneCore *lc, SalOp *op, SalSubscribeStatus ss, Sa LinphonePresenceModel *presence = model ? (LinphonePresenceModel *)model:linphone_presence_model_new_with_activity(LinphonePresenceActivityOffline, NULL); if (linphone_core_get_default_friend_list(lc) != NULL) - lf=linphone_friend_list_find_friend_by_out_subscribe(linphone_core_get_default_friend_list(lc), op); + lf=linphone_core_find_friend_by_out_subscribe(lc, op); if (lf==NULL && lp_config_get_int(lc->config,"sip","allow_out_of_subscribe_presence",0)){ const SalAddress *addr=sal_op_get_from_address(op); - lf = linphone_friend_list_find_friend_by_address(linphone_core_get_default_friend_list(lc), (LinphoneAddress *)addr); + lf = linphone_core_find_friend(lc, (LinphoneAddress *)addr); } if (lf!=NULL){ LinphonePresenceActivity *activity = NULL; diff --git a/coreapi/private.h b/coreapi/private.h index 960e2bb9b..cc8614c64 100644 --- a/coreapi/private.h +++ b/coreapi/private.h @@ -421,6 +421,7 @@ void linphone_friend_add_incoming_subscription(LinphoneFriend *lf, SalOp *op); void linphone_friend_remove_incoming_subscription(LinphoneFriend *lf, SalOp *op); LinphoneFriend *linphone_friend_list_find_friend_by_inc_subscribe(const LinphoneFriendList *list, SalOp *op); LinphoneFriend *linphone_friend_list_find_friend_by_out_subscribe(const LinphoneFriendList *list, SalOp *op); +LinphoneFriend *linphone_core_find_friend_by_out_subscribe(const LinphoneCore *lc, SalOp *op); MSList *linphone_find_friend_by_address(MSList *fl, const LinphoneAddress *addr, LinphoneFriend **lf); bool_t linphone_core_should_subscribe_friends_only_when_registered(const LinphoneCore *lc); void linphone_core_update_friends_subscriptions(LinphoneCore *lc, LinphoneProxyConfig *cfg, bool_t only_when_registered);