Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(308)

Side by Side Diff: delta_performer.cc

Issue 5121008: AU: Check the delta magic and fail on mismatch. (Closed) Base URL: ssh://git@gitrw.chromium.org:9222/update_engine.git@master
Patch Set: fix comment Created 10 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « no previous file | delta_performer_unittest.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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 128 matching lines...) Expand 10 before | Expand all | Expand 10 after
139 139
140 bool DeltaPerformer::OpenKernel(const char* kernel_path) { 140 bool DeltaPerformer::OpenKernel(const char* kernel_path) {
141 int err; 141 int err;
142 bool success = OpenFile(kernel_path, &kernel_fd_, &err); 142 bool success = OpenFile(kernel_path, &kernel_fd_, &err);
143 if (success) 143 if (success)
144 kernel_path_ = kernel_path; 144 kernel_path_ = kernel_path;
145 return success; 145 return success;
146 } 146 }
147 147
148 int DeltaPerformer::Close() { 148 int DeltaPerformer::Close() {
149 if (!buffer_.empty()) {
150 LOG(ERROR) << "Called Close() while buffer not empty!";
151 return -1;
152 }
153 int err = 0; 149 int err = 0;
154 if (close(kernel_fd_) == -1) { 150 if (close(kernel_fd_) == -1) {
155 err = errno; 151 err = errno;
156 PLOG(ERROR) << "Unable to close kernel fd:"; 152 PLOG(ERROR) << "Unable to close kernel fd:";
157 } 153 }
158 if (close(fd_) == -1) { 154 if (close(fd_) == -1) {
159 err = errno; 155 err = errno;
160 PLOG(ERROR) << "Unable to close rootfs fd:"; 156 PLOG(ERROR) << "Unable to close rootfs fd:";
161 } 157 }
162 LOG_IF(ERROR, !hash_calculator_.Finalize()) << "Unable to finalize the hash."; 158 LOG_IF(ERROR, !hash_calculator_.Finalize()) << "Unable to finalize the hash.";
163 fd_ = -2; // Set so that isn't not valid AND calls to Open() will fail. 159 fd_ = -2; // Set to invalid so that calls to Open() will fail.
164 path_ = ""; 160 path_ = "";
161 if (!buffer_.empty()) {
162 LOG(ERROR) << "Called Close() while buffer not empty!";
163 if (err >= 0) {
164 err = 1;
165 }
166 }
165 return -err; 167 return -err;
166 } 168 }
167 169
168 namespace { 170 namespace {
169 171
170 void LogPartitionInfoHash(const PartitionInfo& info, const string& tag) { 172 void LogPartitionInfoHash(const PartitionInfo& info, const string& tag) {
171 string sha256; 173 string sha256;
172 if (OmahaHashCalculator::Base64Encode(info.hash().data(), 174 if (OmahaHashCalculator::Base64Encode(info.hash().data(),
173 info.hash().size(), 175 info.hash().size(),
174 &sha256)) { 176 &sha256)) {
(...skipping 19 matching lines...) Expand all
194 196
195 // Wrapper around write. Returns bytes written on success or 197 // Wrapper around write. Returns bytes written on success or
196 // -errno on error. 198 // -errno on error.
197 // This function performs as many actions as it can, given the amount of 199 // This function performs as many actions as it can, given the amount of
198 // data received thus far. 200 // data received thus far.
199 ssize_t DeltaPerformer::Write(const void* bytes, size_t count) { 201 ssize_t DeltaPerformer::Write(const void* bytes, size_t count) {
200 const char* c_bytes = reinterpret_cast<const char*>(bytes); 202 const char* c_bytes = reinterpret_cast<const char*>(bytes);
201 buffer_.insert(buffer_.end(), c_bytes, c_bytes + count); 203 buffer_.insert(buffer_.end(), c_bytes, c_bytes + count);
202 204
203 if (!manifest_valid_) { 205 if (!manifest_valid_) {
204 // See if we have enough bytes for the manifest yet
205 if (buffer_.size() < strlen(kDeltaMagic) + 206 if (buffer_.size() < strlen(kDeltaMagic) +
206 kDeltaVersionLength + kDeltaProtobufLengthLength) { 207 kDeltaVersionLength + kDeltaProtobufLengthLength) {
207 // Don't have enough bytes to even know the protobuf length 208 // Don't have enough bytes to know the protobuf length.
208 return count; 209 return count;
209 } 210 }
211 if (memcmp(buffer_.data(), kDeltaMagic, strlen(kDeltaMagic)) != 0) {
212 LOG(ERROR) << "Bad payload format -- invalid delta magic.";
213 return -EINVAL;
214 }
210 uint64_t protobuf_length; 215 uint64_t protobuf_length;
211 COMPILE_ASSERT(sizeof(protobuf_length) == kDeltaProtobufLengthLength, 216 COMPILE_ASSERT(sizeof(protobuf_length) == kDeltaProtobufLengthLength,
212 protobuf_length_size_mismatch); 217 protobuf_length_size_mismatch);
213 memcpy(&protobuf_length, 218 memcpy(&protobuf_length,
214 &buffer_[strlen(kDeltaMagic) + kDeltaVersionLength], 219 &buffer_[strlen(kDeltaMagic) + kDeltaVersionLength],
215 kDeltaProtobufLengthLength); 220 kDeltaProtobufLengthLength);
216 protobuf_length = be64toh(protobuf_length); // switch big endian to host 221 protobuf_length = be64toh(protobuf_length); // switch big endian to host
217 if (buffer_.size() < strlen(kDeltaMagic) + kDeltaVersionLength + 222 if (buffer_.size() < strlen(kDeltaMagic) + kDeltaVersionLength +
218 kDeltaProtobufLengthLength + protobuf_length) { 223 kDeltaProtobufLengthLength + protobuf_length) {
219 return count; 224 return count;
(...skipping 524 matching lines...) Expand 10 before | Expand all | Expand 10 after
744 if (prefs_->GetInt64(kPrefsResumedUpdateFailures, &resumed_update_failures)) { 749 if (prefs_->GetInt64(kPrefsResumedUpdateFailures, &resumed_update_failures)) {
745 resumed_update_failures++; 750 resumed_update_failures++;
746 } else { 751 } else {
747 resumed_update_failures = 1; 752 resumed_update_failures = 1;
748 } 753 }
749 prefs_->SetInt64(kPrefsResumedUpdateFailures, resumed_update_failures); 754 prefs_->SetInt64(kPrefsResumedUpdateFailures, resumed_update_failures);
750 return true; 755 return true;
751 } 756 }
752 757
753 } // namespace chromeos_update_engine 758 } // namespace chromeos_update_engine
OLDNEW
« no previous file with comments | « no previous file | delta_performer_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698