Skip to content

Commit 82a36a6

Browse files
committed
Fix Null User State Issue
• Fixes a relatively rare crash (#503) caused by a race condition where a sync state variable was accessed before it was initialized • Resolved by synchronizing the accessor method
1 parent fa6a265 commit 82a36a6

File tree

3 files changed

+13
-14
lines changed

3 files changed

+13
-14
lines changed

OneSignalSDK/onesignal/src/main/java/com/onesignal/UserStateEmailSynchronizer.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,7 @@ void setEmail(String email, String emailAuthHash) {
5757
JSONObject syncValues = getUserStateForModification().syncValues;
5858

5959
boolean noChange = email.equals(syncValues.optString("identifier")) &&
60-
syncValues.optString("email_auth_hash").equals(emailAuthHash == null ? "" : emailAuthHash);
60+
syncValues.optString("email_auth_hash").equals(emailAuthHash == null ? "" : emailAuthHash);
6161
if (noChange) {
6262
OneSignal.fireEmailUpdateSuccess();
6363
return;
@@ -115,7 +115,7 @@ void logoutEmail() {
115115
OneSignal.saveEmailId("");
116116

117117
resetCurrentState();
118-
toSyncUserState.syncValues.remove("identifier");
118+
getToSyncUserState().syncValues.remove("identifier");
119119
toSyncUserState.syncValues.remove("email_auth_hash");
120120
toSyncUserState.syncValues.remove("device_player_id");
121121
toSyncUserState.persistState();

OneSignalSDK/onesignal/src/main/java/com/onesignal/UserStatePushSynchronizer.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -32,16 +32,16 @@ void onSuccess(String responseStr) {
3232
if (lastGetTagsResponse.has("tags")) {
3333
synchronized(syncLock) {
3434
JSONObject dependDiff = generateJsonDiff(currentUserState.syncValues.optJSONObject("tags"),
35-
toSyncUserState.syncValues.optJSONObject("tags"),
35+
getToSyncUserState().syncValues.optJSONObject("tags"),
3636
null, null);
3737

3838
currentUserState.syncValues.put("tags", lastGetTagsResponse.optJSONObject("tags"));
3939
currentUserState.persistState();
4040

4141
// Allow server side tags to overwrite local tags expect for any pending changes
4242
// that haven't been successfully posted.
43-
toSyncUserState.mergeTags(lastGetTagsResponse, dependDiff);
44-
toSyncUserState.persistState();
43+
getToSyncUserState().mergeTags(lastGetTagsResponse, dependDiff);
44+
getToSyncUserState().persistState();
4545
}
4646
}
4747
} catch (JSONException e) {

OneSignalSDK/onesignal/src/main/java/com/onesignal/UserStateSynchronizer.java

Lines changed: 8 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -111,7 +111,7 @@ protected JSONObject generateJsonDiff(JSONObject cur, JSONObject changedTo, JSON
111111
}
112112
}
113113

114-
protected UserState getToSyncUserState() {
114+
protected synchronized UserState getToSyncUserState() {
115115
if (toSyncUserState == null)
116116
toSyncUserState = newUserState("TOSYNC_STATE", true);
117117

@@ -122,8 +122,7 @@ void initUserState() {
122122
if (currentUserState == null)
123123
currentUserState = newUserState("CURRENT_STATE", true);
124124

125-
if (toSyncUserState == null)
126-
toSyncUserState = newUserState("TOSYNC_STATE", true);
125+
getToSyncUserState();
127126
}
128127

129128
abstract protected UserState newUserState(String inPersistKey, boolean load);
@@ -151,7 +150,7 @@ private boolean isSessionCall() {
151150
}
152151

153152
private boolean syncEmailLogout() {
154-
return toSyncUserState.dependValues.optBoolean("logoutEmail", false);
153+
return getToSyncUserState().dependValues.optBoolean("logoutEmail", false);
155154
}
156155

157156
synchronized void syncUserState(boolean fromSyncService) {
@@ -171,14 +170,14 @@ private void internalSyncUserState(boolean fromSyncService) {
171170
final boolean isSessionCall = isSessionCall();
172171
JSONObject jsonBody, dependDiff;
173172
synchronized (syncLock) {
174-
jsonBody = currentUserState.generateJsonDiff(toSyncUserState, isSessionCall);
175-
dependDiff = generateJsonDiff(currentUserState.dependValues, toSyncUserState.dependValues, null, null);
173+
jsonBody = currentUserState.generateJsonDiff(getToSyncUserState(), isSessionCall);
174+
dependDiff = generateJsonDiff(currentUserState.dependValues, getToSyncUserState().dependValues, null, null);
176175

177176
if (jsonBody == null) {
178177
currentUserState.persistStateAfterSync(dependDiff, null);
179178
return;
180179
}
181-
toSyncUserState.persistState();
180+
getToSyncUserState().persistState();
182181
}
183182

184183
if (!isSessionCall || fromSyncService)
@@ -228,7 +227,7 @@ void onSuccess(String response) {
228227
}
229228

230229
private void logoutEmailSyncSuccess() {
231-
toSyncUserState.dependValues.remove("logoutEmail");
230+
getToSyncUserState().dependValues.remove("logoutEmail");
232231
toSyncUserState.dependValues.remove("email_auth_hash");
233232
toSyncUserState.syncValues.remove("parent_player_id");
234233
toSyncUserState.persistState();
@@ -326,7 +325,7 @@ private void handleNetworkFailure() {
326325
if (jsonBody != null)
327326
fireEventsForUpdateFailure(jsonBody);
328327

329-
if (toSyncUserState.dependValues.optBoolean("logoutEmail", false))
328+
if (getToSyncUserState().dependValues.optBoolean("logoutEmail", false))
330329
OneSignal.handleFailedEmailLogout();
331330
}
332331

0 commit comments

Comments
 (0)