jenkins-bot has submitted this change and it was merged.

Change subject: Prevent crash due to non-lead-section index mismatch.
......................................................................


Prevent crash due to non-lead-section index mismatch.

1) This fixes an actual possible condition where this crash occurs:
- A saved page is loaded, and the LoadSavedPageTask takes an abnormally
  long time
- The user presses Back, with the previous page having *more* sections
  than the saved page
- The LoadSavedPageTask completes in the middle of the WebView being
  populated with the previous page, replacing the current Page object with
  a Page that has fewer sections than the current sequence chain expects.

2) This also explicitly patches up the crash, by verifying that the index
is within the size of the current page sections.

Bug: T112519
Change-Id: Ifd168f7babc246a465762c98bc651ce716a0a4b1
---
M app/src/main/java/org/wikipedia/page/JsonPageLoadStrategy.java
M app/src/main/java/org/wikipedia/savedpages/LoadSavedPageTask.java
2 files changed, 21 insertions(+), 5 deletions(-)

Approvals:
  Sniedzielski: Looks good to me, approved
  jenkins-bot: Verified



diff --git a/app/src/main/java/org/wikipedia/page/JsonPageLoadStrategy.java 
b/app/src/main/java/org/wikipedia/page/JsonPageLoadStrategy.java
index ac9b1eb..452a4e6 100644
--- a/app/src/main/java/org/wikipedia/page/JsonPageLoadStrategy.java
+++ b/app/src/main/java/org/wikipedia/page/JsonPageLoadStrategy.java
@@ -445,12 +445,10 @@
     }
 
     public void loadSavedPage(final ErrorCallback errorCallback) {
-        new LoadSavedPageTask(model.getTitle()) {
+        new LoadSavedPageTask(model.getTitle(), sequenceNumber.get()) {
             @Override
             public void onFinish(Page result) {
-                // have we been unwittingly detached from our Activity?
-                if (!fragment.isAdded()) {
-                    Log.d("PageFragment", "Detached from activity, so stopping 
update.");
+                if (!fragment.isAdded() || 
!sequenceNumber.inSync(getSequence())) {
                     return;
                 }
 
@@ -650,7 +648,15 @@
         activity.updateProgressBar(true, false,
                 PageActivity.PROGRESS_BAR_MAX_VALUE / model.getPage()
                         .getSections().size() * index);
-
+        if (index > model.getPage().getSections().size()) {
+            // TODO: Remove this check if we find that it no longer happens, 
or if we fix it.
+            String errorText = "Section index mismatch!";
+            errorText += " modelTitle=" + 
model.getTitleOriginal().getPrefixedText();
+            errorText += ", pageTitle=" + 
model.getPage().getTitle().getPrefixedText();
+            errorText += ", source=" + model.getCurEntry().getSource();
+            L.logRemoteErrorIfProd(new RuntimeException(errorText));
+            return;
+        }
         try {
             final Page page = model.getPage();
             JSONObject wrapper = new JSONObject();
diff --git a/app/src/main/java/org/wikipedia/savedpages/LoadSavedPageTask.java 
b/app/src/main/java/org/wikipedia/savedpages/LoadSavedPageTask.java
index 3320349..489d260 100644
--- a/app/src/main/java/org/wikipedia/savedpages/LoadSavedPageTask.java
+++ b/app/src/main/java/org/wikipedia/savedpages/LoadSavedPageTask.java
@@ -6,10 +6,16 @@
 
 public class LoadSavedPageTask extends SaneAsyncTask<Page> {
     private final PageTitle title;
+    private final int sequence;
 
     public LoadSavedPageTask(PageTitle title) {
+        this(title, 0);
+    }
+
+    public LoadSavedPageTask(PageTitle title, int sequence) {
         super(SINGLE_THREAD);
         this.title = title;
+        this.sequence = sequence;
     }
 
     @Override
@@ -17,4 +23,8 @@
         SavedPage savedPage = new SavedPage(title);
         return savedPage.readFromFileSystem();
     }
+
+    public int getSequence() {
+        return sequence;
+    }
 }

-- 
To view, visit https://gerrit.wikimedia.org/r/257884
To unsubscribe, visit https://gerrit.wikimedia.org/r/settings

Gerrit-MessageType: merged
Gerrit-Change-Id: Ifd168f7babc246a465762c98bc651ce716a0a4b1
Gerrit-PatchSet: 3
Gerrit-Project: apps/android/wikipedia
Gerrit-Branch: master
Gerrit-Owner: Dbrant <[email protected]>
Gerrit-Reviewer: BearND <[email protected]>
Gerrit-Reviewer: Brion VIBBER <[email protected]>
Gerrit-Reviewer: Dbrant <[email protected]>
Gerrit-Reviewer: Mholloway <[email protected]>
Gerrit-Reviewer: Niedzielski <[email protected]>
Gerrit-Reviewer: Sniedzielski <[email protected]>
Gerrit-Reviewer: jenkins-bot <>

_______________________________________________
MediaWiki-commits mailing list
[email protected]
https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits

Reply via email to