Make sure old body files don't contaminate new messages
If we have an error writing an old body file and overwrite the same ID, we might end up in a situation where we have HTML from one message and Text from another. Clean up the body files before insert to avoid this. b/17720266 Change-Id: I2fb18fa24c6f3bc01e7c877e2f3bfccee6a34015
This commit is contained in:
parent
69ba565b62
commit
b62067e3c3
@ -758,12 +758,9 @@ public class EmailProvider extends ContentProvider
|
|||||||
if (messageDeletion) {
|
if (messageDeletion) {
|
||||||
if (match == MESSAGE_ID) {
|
if (match == MESSAGE_ID) {
|
||||||
// Delete the Body record associated with the deleted message
|
// Delete the Body record associated with the deleted message
|
||||||
final ContentValues emptyValues = new ContentValues(2);
|
|
||||||
emptyValues.putNull(BodyColumns.HTML_CONTENT);
|
|
||||||
emptyValues.putNull(BodyColumns.TEXT_CONTENT);
|
|
||||||
final long messageId = Long.valueOf(id);
|
final long messageId = Long.valueOf(id);
|
||||||
try {
|
try {
|
||||||
writeBodyFiles(context, messageId, emptyValues);
|
deleteBodyFiles(context, messageId);
|
||||||
} catch (final IllegalStateException e) {
|
} catch (final IllegalStateException e) {
|
||||||
LogUtils.v(LogUtils.TAG, e, "Exception while deleting bodies");
|
LogUtils.v(LogUtils.TAG, e, "Exception while deleting bodies");
|
||||||
}
|
}
|
||||||
@ -772,13 +769,10 @@ public class EmailProvider extends ContentProvider
|
|||||||
// Delete any orphaned Body records
|
// Delete any orphaned Body records
|
||||||
final Cursor orphans = db.rawQuery(ORPHAN_BODY_MESSAGE_ID_SELECT, null);
|
final Cursor orphans = db.rawQuery(ORPHAN_BODY_MESSAGE_ID_SELECT, null);
|
||||||
try {
|
try {
|
||||||
final ContentValues emptyValues = new ContentValues(2);
|
|
||||||
emptyValues.putNull(BodyColumns.HTML_CONTENT);
|
|
||||||
emptyValues.putNull(BodyColumns.TEXT_CONTENT);
|
|
||||||
while (orphans.moveToNext()) {
|
while (orphans.moveToNext()) {
|
||||||
final long messageId = orphans.getLong(0);
|
final long messageId = orphans.getLong(0);
|
||||||
try {
|
try {
|
||||||
writeBodyFiles(context, messageId, emptyValues);
|
deleteBodyFiles(context, messageId);
|
||||||
} catch (final IllegalStateException e) {
|
} catch (final IllegalStateException e) {
|
||||||
LogUtils.v(LogUtils.TAG, e, "Exception while deleting bodies");
|
LogUtils.v(LogUtils.TAG, e, "Exception while deleting bodies");
|
||||||
}
|
}
|
||||||
@ -908,6 +902,8 @@ public class EmailProvider extends ContentProvider
|
|||||||
"Cannot insert body without MESSAGE_KEY");
|
"Cannot insert body without MESSAGE_KEY");
|
||||||
}
|
}
|
||||||
final long messageId = values.getAsLong(BodyColumns.MESSAGE_KEY);
|
final long messageId = values.getAsLong(BodyColumns.MESSAGE_KEY);
|
||||||
|
// Ensure that no pre-existing body files contaminate the message
|
||||||
|
deleteBodyFiles(context, messageId);
|
||||||
writeBodyFiles(getContext(), messageId, values);
|
writeBodyFiles(getContext(), messageId, values);
|
||||||
break;
|
break;
|
||||||
// NOTE: It is NOT legal for production code to insert directly into UPDATED_MESSAGE
|
// NOTE: It is NOT legal for production code to insert directly into UPDATED_MESSAGE
|
||||||
@ -2220,6 +2216,14 @@ public class EmailProvider extends ContentProvider
|
|||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private static void deleteBodyFiles(final Context c, final long messageId)
|
||||||
|
throws IllegalStateException {
|
||||||
|
final ContentValues emptyValues = new ContentValues(2);
|
||||||
|
emptyValues.putNull(BodyColumns.HTML_CONTENT);
|
||||||
|
emptyValues.putNull(BodyColumns.TEXT_CONTENT);
|
||||||
|
writeBodyFiles(c, messageId, emptyValues);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Writes message bodies to disk, read from a set of ContentValues
|
* Writes message bodies to disk, read from a set of ContentValues
|
||||||
*
|
*
|
||||||
|
Loading…
Reference in New Issue
Block a user