Index: omaha_request_params.cc |
diff --git a/omaha_request_params.cc b/omaha_request_params.cc |
index 6884c839a478265c4ab3072cb1fe6ef77cfa28ff..eaff3d36a6659dfbf6f9f3adbf8d48c3c2ed182b 100644 |
--- a/omaha_request_params.cc |
+++ b/omaha_request_params.cc |
@@ -10,6 +10,7 @@ |
#include <map> |
#include <string> |
+#include <vector> |
#include <base/file_util.h> |
#include <base/string_util.h> |
@@ -21,6 +22,7 @@ |
using std::map; |
using std::string; |
+using std::vector; |
namespace chromeos_update_engine { |
@@ -44,28 +46,50 @@ bool OmahaRequestDeviceParams::Init(const std::string& in_app_version, |
os_platform = OmahaRequestParams::kOsPlatform; |
os_version = OmahaRequestParams::kOsVersion; |
app_version = in_app_version.empty() ? |
- GetLsbValue("CHROMEOS_RELEASE_VERSION", "", NULL) : in_app_version; |
+ GetLsbValue("CHROMEOS_RELEASE_VERSION", "", NULL, true) : in_app_version; |
os_sp = app_version + "_" + GetMachineType(); |
- os_board = GetLsbValue("CHROMEOS_RELEASE_BOARD", "", NULL); |
+ os_board = GetLsbValue("CHROMEOS_RELEASE_BOARD", "", NULL, true); |
app_id = GetLsbValue("CHROMEOS_RELEASE_APPID", |
OmahaRequestParams::kAppId, |
- NULL); |
+ NULL, |
+ true); |
app_lang = "en-US"; |
app_track = GetLsbValue( |
kUpdateTrackKey, |
"", |
- &chromeos_update_engine::OmahaRequestDeviceParams::IsValidTrack); |
+ &chromeos_update_engine::OmahaRequestDeviceParams::IsValidTrack, |
+ true); |
hardware_class = GetHardwareClass(); |
struct stat stbuf; |
- // Deltas are only okay if the /.nodelta file does not exist. |
- // If we don't know (i.e. stat() returns some unexpected error), |
- // then err on the side of caution and say deltas are not okay |
+ // Deltas are only okay if the /.nodelta file does not exist. If we don't |
+ // know (i.e. stat() returns some unexpected error), then err on the side of |
+ // caution and say deltas are not okay. |
delta_okay = (stat((root_ + "/.nodelta").c_str(), &stbuf) < 0) && |
(errno == ENOENT); |
+ // For now, disable delta updates if the rootfs track is different than the |
+ // track that we're sending to the update server because such updates are |
+ // destined to fail -- the source rootfs hash will be different than the |
+ // expected hash due to the different track in /etc/lsb-release. |
+ // |
+ // Longer term we should consider an alternative: (a) clients can send |
+ // (current_version, current_channel, new_channel) information, or (b) the |
+ // build process can make sure releases on separate tracks are identical (i.e, |
+ // by not stamping the release with the channel), or (c) the release process |
+ // can ensure that different channels get different version numbers. |
+ const string rootfs_track = GetLsbValue( |
+ kUpdateTrackKey, |
+ "", |
+ &chromeos_update_engine::OmahaRequestDeviceParams::IsValidTrack, |
+ false); |
+ delta_okay = delta_okay && rootfs_track == app_track; |
+ |
update_url = in_update_url.empty() ? |
- GetLsbValue("CHROMEOS_AUSERVER", OmahaRequestParams::kUpdateUrl, NULL) : |
+ GetLsbValue("CHROMEOS_AUSERVER", |
+ OmahaRequestParams::kUpdateUrl, |
+ NULL, |
+ true) : |
in_update_url; |
return true; |
} |
@@ -103,14 +127,19 @@ string OmahaRequestDeviceParams::GetDeviceTrack() { |
string OmahaRequestDeviceParams::GetLsbValue(const string& key, |
const string& default_value, |
- ValueValidator validator) const { |
- string files[] = {string(utils::kStatefulPartition) + "/etc/lsb-release", |
- "/etc/lsb-release"}; |
- for (unsigned int i = 0; i < arraysize(files); ++i) { |
- // TODO(adlr): make sure files checked are owned as root (and all |
- // their parents are recursively, too). |
+ ValueValidator validator, |
+ bool stateful_override) const { |
+ vector<string> files; |
+ if (stateful_override) { |
+ files.push_back(string(utils::kStatefulPartition) + "/etc/lsb-release"); |
+ } |
+ files.push_back("/etc/lsb-release"); |
+ for (vector<string>::const_iterator it = files.begin(); |
+ it != files.end(); ++it) { |
+ // TODO(adlr): make sure files checked are owned as root (and all their |
+ // parents are recursively, too). |
string file_data; |
- if (!utils::ReadFileToString(root_ + files[i], &file_data)) |
+ if (!utils::ReadFileToString(root_ + *it, &file_data)) |
continue; |
map<string, string> data = simple_key_value_store::ParseString(file_data); |