Commit 91c26fa8 authored by Jon Mann's avatar Jon Mann Committed by Commit Bot

Encode serialized proto in base64 before saving to base::Value.

This fixes a broken DCHECK caused by storing a string which is not
UTF8 encoded in a base::Value.

Bug: 966270
Change-Id: I6e2084ffebe3bb8cefa1bd48f0f39e435c3442e4
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2186747Reviewed-by: default avatarJames Vecore <vecore@google.com>
Commit-Queue: Jon Mann <jonmann@chromium.org>
Cr-Commit-Position: refs/heads/master@{#766438}
parent 37fb86b5
...@@ -4,6 +4,7 @@ ...@@ -4,6 +4,7 @@
#include "chromeos/components/sync_wifi/pending_network_configuration_tracker_impl.h" #include "chromeos/components/sync_wifi/pending_network_configuration_tracker_impl.h"
#include "base/base64url.h"
#include "base/guid.h" #include "base/guid.h"
#include "base/optional.h" #include "base/optional.h"
#include "base/strings/stringprintf.h" #include "base/strings/stringprintf.h"
...@@ -34,10 +35,15 @@ PendingNetworkConfigurationUpdate ConvertToPendingUpdate( ...@@ -34,10 +35,15 @@ PendingNetworkConfigurationUpdate ConvertToPendingUpdate(
const NetworkIdentifier& id) { const NetworkIdentifier& id) {
std::string* change_guid = dict->FindStringKey(kChangeGuidKey); std::string* change_guid = dict->FindStringKey(kChangeGuidKey);
base::Optional<sync_pb::WifiConfigurationSpecifics> specifics; base::Optional<sync_pb::WifiConfigurationSpecifics> specifics;
std::string* specifics_string = dict->FindStringKey(kSpecificsKey); std::string* encoded_specifics_string = dict->FindStringKey(kSpecificsKey);
if (!specifics_string->empty()) { std::string specifics_string;
if (encoded_specifics_string &&
base::Base64UrlDecode(*encoded_specifics_string,
base::Base64UrlDecodePolicy::REQUIRE_PADDING,
&specifics_string) &&
!specifics_string.empty()) {
sync_pb::WifiConfigurationSpecifics data; sync_pb::WifiConfigurationSpecifics data;
data.ParseFromString(*specifics_string); data.ParseFromString(specifics_string);
specifics = data; specifics = data;
} }
base::Optional<int> completed_attempts = base::Optional<int> completed_attempts =
...@@ -76,11 +82,16 @@ std::string PendingNetworkConfigurationTrackerImpl::TrackPendingUpdate( ...@@ -76,11 +82,16 @@ std::string PendingNetworkConfigurationTrackerImpl::TrackPendingUpdate(
else else
CHECK(specifics->SerializeToString(&serialized_specifics)); CHECK(specifics->SerializeToString(&serialized_specifics));
// base::Value only allows UTF8 encoded strings.
std::string encoded_specifics;
base::Base64UrlEncode(serialized_specifics,
base::Base64UrlEncodePolicy::INCLUDE_PADDING,
&encoded_specifics);
std::string change_guid = base::GenerateGUID(); std::string change_guid = base::GenerateGUID();
dict_.SetPath(GeneratePath(id, kChangeGuidKey), base::Value(change_guid)); dict_.SetPath(GeneratePath(id, kChangeGuidKey), base::Value(change_guid));
dict_.SetPath(GeneratePath(id, kSpecificsKey), dict_.SetPath(GeneratePath(id, kSpecificsKey),
base::Value(serialized_specifics)); base::Value(encoded_specifics));
dict_.SetPath(GeneratePath(id, kCompletedAttemptsKey), base::Value(0)); dict_.SetPath(GeneratePath(id, kCompletedAttemptsKey), base::Value(0));
pref_service_->Set(kPendingNetworkConfigurationsPref, dict_); pref_service_->Set(kPendingNetworkConfigurationsPref, dict_);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment