| Index: delta_performer.cc
 | 
| diff --git a/delta_performer.cc b/delta_performer.cc
 | 
| index 9bf3d34ad49bc9fd62d1830ec09c24bf683bd167..8fc479b7d3d98993f14c37dd2163acdcaee57e2e 100644
 | 
| --- a/delta_performer.cc
 | 
| +++ b/delta_performer.cc
 | 
| @@ -40,6 +40,7 @@ const int kDeltaProtobufLengthLength = 8;
 | 
|  const char kUpdatePayloadPublicKeyPath[] =
 | 
|      "/usr/share/update_engine/update-payload-key.pub.pem";
 | 
|  const int kUpdateStateOperationInvalid = -1;
 | 
| +const int kMaxResumedUpdateFailures = 10;
 | 
|  
 | 
|  // Converts extents to a human-readable string, for use by DumpUpdateProto().
 | 
|  string ExtentsToString(const RepeatedPtrField<Extent>& extents) {
 | 
| @@ -563,6 +564,11 @@ bool DeltaPerformer::CanResumeUpdate(PrefsInterface* prefs,
 | 
|                          !interrupted_hash.empty() &&
 | 
|                          interrupted_hash == update_check_response_hash);
 | 
|  
 | 
| +  int64_t resumed_update_failures;
 | 
| +  TEST_AND_RETURN_FALSE(!prefs->GetInt64(kPrefsResumedUpdateFailures,
 | 
| +                                         &resumed_update_failures) ||
 | 
| +                        resumed_update_failures <= kMaxResumedUpdateFailures);
 | 
| +
 | 
|    // Sanity check the rest.
 | 
|    int64_t next_data_offset = -1;
 | 
|    TEST_AND_RETURN_FALSE(prefs->GetInt64(kPrefsUpdateStateNextDataOffset,
 | 
| @@ -591,6 +597,7 @@ bool DeltaPerformer::ResetUpdateProgress(PrefsInterface* prefs, bool quick) {
 | 
|      prefs->SetString(kPrefsUpdateStateSHA256Context, "");
 | 
|      prefs->SetString(kPrefsUpdateStateSignedSHA256Context, "");
 | 
|      prefs->SetInt64(kPrefsManifestMetadataSize, -1);
 | 
| +    prefs->SetInt64(kPrefsResumedUpdateFailures, 0);
 | 
|    }
 | 
|    return true;
 | 
|  }
 | 
| @@ -648,6 +655,14 @@ bool DeltaPerformer::PrimeUpdateState() {
 | 
|                          manifest_metadata_size > 0);
 | 
|    manifest_metadata_size_ = manifest_metadata_size;
 | 
|  
 | 
| +  // Speculatively count the resume as a failure.
 | 
| +  int64_t resumed_update_failures;
 | 
| +  if (prefs_->GetInt64(kPrefsResumedUpdateFailures, &resumed_update_failures)) {
 | 
| +    resumed_update_failures++;
 | 
| +  } else {
 | 
| +    resumed_update_failures = 1;
 | 
| +  }
 | 
| +  prefs_->SetInt64(kPrefsResumedUpdateFailures, resumed_update_failures);
 | 
|    return true;
 | 
|  }
 | 
|  
 | 
| 
 |