@@ -308,14 +308,17 @@ int mptcp_pm_nl_remove_doit(struct sk_buff *skb, struct genl_info *info)
308308
309309 lock_sock (sk );
310310
311+ spin_lock_bh (& msk -> pm .lock );
311312 match = mptcp_userspace_pm_lookup_addr_by_id (msk , id_val );
312313 if (!match ) {
313314 GENL_SET_ERR_MSG (info , "address with specified id not found" );
315+ spin_unlock_bh (& msk -> pm .lock );
314316 release_sock (sk );
315317 goto out ;
316318 }
317319
318320 list_move (& match -> list , & free_list );
321+ spin_unlock_bh (& msk -> pm .lock );
319322
320323 mptcp_pm_remove_addrs (msk , & free_list );
321324
@@ -560,6 +563,7 @@ int mptcp_userspace_pm_set_flags(struct sk_buff *skb, struct genl_info *info)
560563 struct nlattr * token = info -> attrs [MPTCP_PM_ATTR_TOKEN ];
561564 struct nlattr * attr = info -> attrs [MPTCP_PM_ATTR_ADDR ];
562565 struct net * net = sock_net (skb -> sk );
566+ struct mptcp_pm_addr_entry * entry ;
563567 struct mptcp_sock * msk ;
564568 int ret = - EINVAL ;
565569 struct sock * sk ;
@@ -601,6 +605,17 @@ int mptcp_userspace_pm_set_flags(struct sk_buff *skb, struct genl_info *info)
601605 if (loc .flags & MPTCP_PM_ADDR_FLAG_BACKUP )
602606 bkup = 1 ;
603607
608+ spin_lock_bh (& msk -> pm .lock );
609+ list_for_each_entry (entry , & msk -> pm .userspace_pm_local_addr_list , list ) {
610+ if (mptcp_addresses_equal (& entry -> addr , & loc .addr , false)) {
611+ if (bkup )
612+ entry -> flags |= MPTCP_PM_ADDR_FLAG_BACKUP ;
613+ else
614+ entry -> flags &= ~MPTCP_PM_ADDR_FLAG_BACKUP ;
615+ }
616+ }
617+ spin_unlock_bh (& msk -> pm .lock );
618+
604619 lock_sock (sk );
605620 ret = mptcp_pm_nl_mp_prio_send_ack (msk , & loc .addr , & rem .addr , bkup );
606621 release_sock (sk );
0 commit comments