Guard against possible invalid conversation data loads.

This commit is contained in:
Greyson Parrelli 2020-06-02 10:08:07 -04:00
parent 07d19f38e3
commit 2b11bca7dc

View file

@ -63,6 +63,10 @@ class ConversationDataSource extends PositionalDataSource<MessageRecord> {
int totalCount = db.getConversationCount(threadId); int totalCount = db.getConversationCount(threadId);
int effectiveCount = params.requestedStartPosition; int effectiveCount = params.requestedStartPosition;
if (totalCount == 0 || params.requestedStartPosition > totalCount) {
}
try (MmsSmsDatabase.Reader reader = db.readerFor(db.getConversation(threadId, params.requestedStartPosition, params.requestedLoadSize))) { try (MmsSmsDatabase.Reader reader = db.readerFor(db.getConversation(threadId, params.requestedStartPosition, params.requestedLoadSize))) {
MessageRecord record; MessageRecord record;
while ((record = reader.getNext()) != null && effectiveCount < totalCount && !isInvalid()) { while ((record = reader.getNext()) != null && effectiveCount < totalCount && !isInvalid()) {
@ -71,10 +75,12 @@ class ConversationDataSource extends PositionalDataSource<MessageRecord> {
} }
} }
if (!isInvalid()) {
SizeFixResult result = ensureMultipleOfPageSize(records, params.requestedStartPosition, params.pageSize, totalCount); SizeFixResult result = ensureMultipleOfPageSize(records, params.requestedStartPosition, params.pageSize, totalCount);
callback.onResult(result.messages, params.requestedStartPosition, result.total); 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" : ""));
} }
@ -104,7 +110,7 @@ class ConversationDataSource extends PositionalDataSource<MessageRecord> {
int pageSize, int pageSize,
int total) int total)
{ {
if (records.size() + startPosition == total || records.size() % pageSize == 0) { if (records.size() + startPosition == total || (records.size() != 0 && records.size() % pageSize == 0)) {
return new SizeFixResult(records, total); return new SizeFixResult(records, total);
} }