Fix potential crash with data size in ConversationDataSource.

This commit is contained in:
Greyson Parrelli 2020-05-25 14:00:53 -04:00
parent f96fb72eb1
commit ce21eb241a

View File

@ -17,7 +17,6 @@ import org.thoughtcrime.securesms.util.concurrent.SignalExecutors;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.util.Locale;
import java.util.concurrent.Executor; import java.util.concurrent.Executor;
/** /**
@ -72,9 +71,9 @@ class ConversationDataSource extends PositionalDataSource<MessageRecord> {
} }
} }
records = ensureMultipleOfPageSize(records, params.pageSize, totalCount); SizeFixResult result = ensureMultipleOfPageSize(records, params.requestedStartPosition, params.pageSize, totalCount);
callback.onResult(records, params.requestedStartPosition, totalCount); callback.onResult(result.messages, params.requestedStartPosition, result.total);
Util.runOnMain(dataUpdateCallback::onDataUpdated); Util.runOnMain(dataUpdateCallback::onDataUpdated);
Log.d(TAG, "[Initial Load] " + (System.currentTimeMillis() - start) + " ms" + (isInvalid() ? " -- invalidated" : "")); Log.d(TAG, "[Initial Load] " + (System.currentTimeMillis() - start) + " ms" + (isInvalid() ? " -- invalidated" : ""));
@ -100,12 +99,33 @@ class ConversationDataSource extends PositionalDataSource<MessageRecord> {
Log.d(TAG, "[Update] " + (System.currentTimeMillis() - start) + " ms" + (isInvalid() ? " -- invalidated" : "")); Log.d(TAG, "[Update] " + (System.currentTimeMillis() - start) + " ms" + (isInvalid() ? " -- invalidated" : ""));
} }
private static @NonNull List<MessageRecord> ensureMultipleOfPageSize(@NonNull List<MessageRecord> records, int pageSize, int total) { private static @NonNull SizeFixResult ensureMultipleOfPageSize(@NonNull List<MessageRecord> records,
if (records.size() != total && records.size() > pageSize && records.size() % pageSize != 0) { int startPosition,
int pageSize,
int total)
{
if (records.size() + startPosition == total || records.size() % pageSize == 0) {
return new SizeFixResult(records, total);
}
if (records.size() < pageSize) {
Log.w(TAG, "Hit a miscalculation where we don't have the full dataset, but it's smaller than a page size. records: " + records.size() + ", startPosition: " + startPosition + ", pageSize: " + pageSize + ", total: " + total);
return new SizeFixResult(records, records.size() + startPosition);
}
Log.w(TAG, "Hit a miscalculation where our data size isn't a multiple of the page size. records: " + records.size() + ", startPosition: " + startPosition + ", pageSize: " + pageSize + ", total: " + total);
int overflow = records.size() % pageSize; int overflow = records.size() % pageSize;
return records.subList(0, records.size() - overflow);
} else { return new SizeFixResult(records.subList(0, records.size() - overflow), total);
return records; }
private static class SizeFixResult {
final List<MessageRecord> messages;
final int total;
private SizeFixResult(@NonNull List<MessageRecord> messages, int total) {
this.messages = messages;
this.total = total;
} }
} }