From 40d1fe75b3af725d79b5406408668779bba069a0 Mon Sep 17 00:00:00 2001 From: Ashoat Tevosyan Date: Thu, 26 Sep 2024 15:36:58 -0400 Subject: [PATCH] [lib] Don't insert username into UserStore when UserInfo missing Summary: This addresses [ENG-9373](https://linear.app/comm/issue/ENG-9373/peer-user-bs-app-crashes-when-user-a-deletes-account). What's happening here: 1. When `findUserIdentities` starts, there is a `UserInfo` for this user in the store 2. By the time `findUserIdentitiesActionTypes.success` is reduced, the `UserInfo` is empty, so we end up inserting just the `username` into the store 3. As a result, we end up passing a `UserInfo` without an ID to C++, which causes a crash Test Plan: I tested the following 5 times and confirmed that it didn't cause a crash: 1. Create a test account on iOS Simulator 2. Create a test account on Android 3. Send a friend request from Android to iOS (necessary to create a relationship) 4. Delete account on Android Reviewers: varun, will Reviewed By: varun Subscribers: tomek Differential Revision: https://phab.comm.dev/D13494 --- lib/reducers/user-reducer.js | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/lib/reducers/user-reducer.js b/lib/reducers/user-reducer.js index d1f4836dcb..95a8c4eaf1 100644 --- a/lib/reducers/user-reducer.js +++ b/lib/reducers/user-reducer.js @@ -369,16 +369,19 @@ function reduceUserInfos( ]; } } else if (action.type === findUserIdentitiesActionTypes.success) { - const newUserInfos = action.payload.userInfos.reduce( - (acc, userInfo) => ({ + const newUserInfos = action.payload.userInfos.reduce((acc, userInfo) => { + const existingUserInfo = state.userInfos[userInfo.id]; + if (!existingUserInfo) { + return acc; + } + return { ...acc, [userInfo.id]: { - ...state.userInfos[userInfo.id], + ...existingUserInfo, username: userInfo.username, }, - }), - {}, - ); + }; + }, {}); const userStoreOps: $ReadOnlyArray = convertUserInfosToReplaceUserOps(newUserInfos);