| OLD | NEW | 
|    1 // Copyright (c) 2010 The Chromium OS Authors. All rights reserved. |    1 // Copyright (c) 2010 The Chromium OS Authors. All rights reserved. | 
|    2 // Use of this source code is governed by a BSD-style license that can be |    2 // Use of this source code is governed by a BSD-style license that can be | 
|    3 // found in the LICENSE file. |    3 // found in the LICENSE file. | 
|    4  |    4  | 
|    5 #include "update_engine/delta_performer.h" |    5 #include "update_engine/delta_performer.h" | 
|    6  |    6  | 
|    7 #include <endian.h> |    7 #include <endian.h> | 
|    8 #include <errno.h> |    8 #include <errno.h> | 
|    9  |    9  | 
|   10 #include <algorithm> |   10 #include <algorithm> | 
| (...skipping 22 matching lines...) Expand all  Loading... | 
|   33  |   33  | 
|   34 namespace chromeos_update_engine { |   34 namespace chromeos_update_engine { | 
|   35  |   35  | 
|   36 namespace { |   36 namespace { | 
|   37  |   37  | 
|   38 const int kDeltaVersionLength = 8; |   38 const int kDeltaVersionLength = 8; | 
|   39 const int kDeltaProtobufLengthLength = 8; |   39 const int kDeltaProtobufLengthLength = 8; | 
|   40 const char kUpdatePayloadPublicKeyPath[] = |   40 const char kUpdatePayloadPublicKeyPath[] = | 
|   41     "/usr/share/update_engine/update-payload-key.pub.pem"; |   41     "/usr/share/update_engine/update-payload-key.pub.pem"; | 
|   42 const int kUpdateStateOperationInvalid = -1; |   42 const int kUpdateStateOperationInvalid = -1; | 
 |   43 const int kMaxResumedUpdateFailures = 10; | 
|   43  |   44  | 
|   44 // Converts extents to a human-readable string, for use by DumpUpdateProto(). |   45 // Converts extents to a human-readable string, for use by DumpUpdateProto(). | 
|   45 string ExtentsToString(const RepeatedPtrField<Extent>& extents) { |   46 string ExtentsToString(const RepeatedPtrField<Extent>& extents) { | 
|   46   string ret; |   47   string ret; | 
|   47   for (int i = 0; i < extents.size(); i++) { |   48   for (int i = 0; i < extents.size(); i++) { | 
|   48     const Extent& extent = extents.Get(i); |   49     const Extent& extent = extents.Get(i); | 
|   49     if (extent.start_block() == kSparseHole) { |   50     if (extent.start_block() == kSparseHole) { | 
|   50       ret += StringPrintf("{kSparseHole, %" PRIu64 "}, ", extent.num_blocks()); |   51       ret += StringPrintf("{kSparseHole, %" PRIu64 "}, ", extent.num_blocks()); | 
|   51     } else { |   52     } else { | 
|   52       ret += StringPrintf("{%" PRIu64 ", %" PRIu64 "}, ", |   53       ret += StringPrintf("{%" PRIu64 ", %" PRIu64 "}, ", | 
| (...skipping 503 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|  556                                         &next_operation) && |  557                                         &next_operation) && | 
|  557                         next_operation != kUpdateStateOperationInvalid && |  558                         next_operation != kUpdateStateOperationInvalid && | 
|  558                         next_operation > 0); |  559                         next_operation > 0); | 
|  559  |  560  | 
|  560   string interrupted_hash; |  561   string interrupted_hash; | 
|  561   TEST_AND_RETURN_FALSE(prefs->GetString(kPrefsUpdateCheckResponseHash, |  562   TEST_AND_RETURN_FALSE(prefs->GetString(kPrefsUpdateCheckResponseHash, | 
|  562                                          &interrupted_hash) && |  563                                          &interrupted_hash) && | 
|  563                         !interrupted_hash.empty() && |  564                         !interrupted_hash.empty() && | 
|  564                         interrupted_hash == update_check_response_hash); |  565                         interrupted_hash == update_check_response_hash); | 
|  565  |  566  | 
 |  567   int64_t resumed_update_failures; | 
 |  568   TEST_AND_RETURN_FALSE(!prefs->GetInt64(kPrefsResumedUpdateFailures, | 
 |  569                                          &resumed_update_failures) || | 
 |  570                         resumed_update_failures <= kMaxResumedUpdateFailures); | 
 |  571  | 
|  566   // Sanity check the rest. |  572   // Sanity check the rest. | 
|  567   int64_t next_data_offset = -1; |  573   int64_t next_data_offset = -1; | 
|  568   TEST_AND_RETURN_FALSE(prefs->GetInt64(kPrefsUpdateStateNextDataOffset, |  574   TEST_AND_RETURN_FALSE(prefs->GetInt64(kPrefsUpdateStateNextDataOffset, | 
|  569                                         &next_data_offset) && |  575                                         &next_data_offset) && | 
|  570                         next_data_offset >= 0); |  576                         next_data_offset >= 0); | 
|  571  |  577  | 
|  572   string sha256_context; |  578   string sha256_context; | 
|  573   TEST_AND_RETURN_FALSE( |  579   TEST_AND_RETURN_FALSE( | 
|  574       prefs->GetString(kPrefsUpdateStateSHA256Context, &sha256_context) && |  580       prefs->GetString(kPrefsUpdateStateSHA256Context, &sha256_context) && | 
|  575       !sha256_context.empty()); |  581       !sha256_context.empty()); | 
|  576  |  582  | 
|  577   int64_t manifest_metadata_size = 0; |  583   int64_t manifest_metadata_size = 0; | 
|  578   TEST_AND_RETURN_FALSE(prefs->GetInt64(kPrefsManifestMetadataSize, |  584   TEST_AND_RETURN_FALSE(prefs->GetInt64(kPrefsManifestMetadataSize, | 
|  579                                         &manifest_metadata_size) && |  585                                         &manifest_metadata_size) && | 
|  580                         manifest_metadata_size > 0); |  586                         manifest_metadata_size > 0); | 
|  581  |  587  | 
|  582   return true; |  588   return true; | 
|  583 } |  589 } | 
|  584  |  590  | 
|  585 bool DeltaPerformer::ResetUpdateProgress(PrefsInterface* prefs, bool quick) { |  591 bool DeltaPerformer::ResetUpdateProgress(PrefsInterface* prefs, bool quick) { | 
|  586   TEST_AND_RETURN_FALSE(prefs->SetInt64(kPrefsUpdateStateNextOperation, |  592   TEST_AND_RETURN_FALSE(prefs->SetInt64(kPrefsUpdateStateNextOperation, | 
|  587                                         kUpdateStateOperationInvalid)); |  593                                         kUpdateStateOperationInvalid)); | 
|  588   if (!quick) { |  594   if (!quick) { | 
|  589     prefs->SetString(kPrefsUpdateCheckResponseHash, ""); |  595     prefs->SetString(kPrefsUpdateCheckResponseHash, ""); | 
|  590     prefs->SetInt64(kPrefsUpdateStateNextDataOffset, -1); |  596     prefs->SetInt64(kPrefsUpdateStateNextDataOffset, -1); | 
|  591     prefs->SetString(kPrefsUpdateStateSHA256Context, ""); |  597     prefs->SetString(kPrefsUpdateStateSHA256Context, ""); | 
|  592     prefs->SetString(kPrefsUpdateStateSignedSHA256Context, ""); |  598     prefs->SetString(kPrefsUpdateStateSignedSHA256Context, ""); | 
|  593     prefs->SetInt64(kPrefsManifestMetadataSize, -1); |  599     prefs->SetInt64(kPrefsManifestMetadataSize, -1); | 
 |  600     prefs->SetInt64(kPrefsResumedUpdateFailures, 0); | 
|  594   } |  601   } | 
|  595   return true; |  602   return true; | 
|  596 } |  603 } | 
|  597  |  604  | 
|  598 bool DeltaPerformer::CheckpointUpdateProgress() { |  605 bool DeltaPerformer::CheckpointUpdateProgress() { | 
|  599   Terminator::set_exit_blocked(true); |  606   Terminator::set_exit_blocked(true); | 
|  600   if (last_updated_buffer_offset_ != buffer_offset_) { |  607   if (last_updated_buffer_offset_ != buffer_offset_) { | 
|  601     // Resets the progress in case we die in the middle of the state update. |  608     // Resets the progress in case we die in the middle of the state update. | 
|  602     ResetUpdateProgress(prefs_, true); |  609     ResetUpdateProgress(prefs_, true); | 
|  603     TEST_AND_RETURN_FALSE( |  610     TEST_AND_RETURN_FALSE( | 
| (...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|  641   TEST_AND_RETURN_FALSE(prefs_->GetString(kPrefsUpdateStateSHA256Context, |  648   TEST_AND_RETURN_FALSE(prefs_->GetString(kPrefsUpdateStateSHA256Context, | 
|  642                                           &hash_context) && |  649                                           &hash_context) && | 
|  643                         hash_calculator_.SetContext(hash_context)); |  650                         hash_calculator_.SetContext(hash_context)); | 
|  644  |  651  | 
|  645   int64_t manifest_metadata_size = 0; |  652   int64_t manifest_metadata_size = 0; | 
|  646   TEST_AND_RETURN_FALSE(prefs_->GetInt64(kPrefsManifestMetadataSize, |  653   TEST_AND_RETURN_FALSE(prefs_->GetInt64(kPrefsManifestMetadataSize, | 
|  647                                          &manifest_metadata_size) && |  654                                          &manifest_metadata_size) && | 
|  648                         manifest_metadata_size > 0); |  655                         manifest_metadata_size > 0); | 
|  649   manifest_metadata_size_ = manifest_metadata_size; |  656   manifest_metadata_size_ = manifest_metadata_size; | 
|  650  |  657  | 
 |  658   // Speculatively count the resume as a failure. | 
 |  659   int64_t resumed_update_failures; | 
 |  660   if (prefs_->GetInt64(kPrefsResumedUpdateFailures, &resumed_update_failures)) { | 
 |  661     resumed_update_failures++; | 
 |  662   } else { | 
 |  663     resumed_update_failures = 1; | 
 |  664   } | 
 |  665   prefs_->SetInt64(kPrefsResumedUpdateFailures, resumed_update_failures); | 
|  651   return true; |  666   return true; | 
|  652 } |  667 } | 
|  653  |  668  | 
|  654 }  // namespace chromeos_update_engine |  669 }  // namespace chromeos_update_engine | 
| OLD | NEW |