Index: chromeos_login.cc |
diff --git a/chromeos_login.cc b/chromeos_login.cc |
index 201eac93a2391ae08164dc2aa6f307bef1bc4401..a366b0969904c5799401db7695bde72731f3ed5f 100644 |
--- a/chromeos_login.cc |
+++ b/chromeos_login.cc |
@@ -229,6 +229,8 @@ bool ChromeOSRetrievePropertySafe(const char* name, Property** OUT_property) { |
if (!ChromeOSLoginHelpers::RetrievePropertyHelper(name, &value, &sig)) |
return false; |
*OUT_property = ChromeOSLoginHelpers::CreateProperty(name, value, sig); |
+ g_array_free(sig, false); |
+ g_free(value); |
return true; |
} |
@@ -463,18 +465,22 @@ void RetrievePolicyNotify(DBusGProxy* gproxy, |
reinterpret_cast<CallbackData<RetrievePolicyCallback>*>(user_data); |
DCHECK(cb_data); |
glib::ScopedError error; |
- gchar* policy_blob = NULL; |
+ GArray* policy_blob = NULL; |
if (!::dbus_g_proxy_end_call(gproxy, |
call_id, |
&Resetter(&error).lvalue(), |
- G_TYPE_STRING, &policy_blob, |
+ DBUS_TYPE_G_UCHAR_ARRAY, &policy_blob, |
G_TYPE_INVALID)) { |
LOG(ERROR) << login_manager::kSessionManagerRetrievePolicy |
<< " failed: " << SCOPED_SAFE_MESSAGE(error); |
} |
- cb_data->callback(cb_data->object, policy_blob); |
- if (policy_blob) |
- g_free(policy_blob); |
+ if (policy_blob) { |
+ std::string policy(policy_blob->data, policy_blob->len); |
+ cb_data->callback(cb_data->object, policy.c_str()); |
+ g_array_free(policy_blob, TRUE); |
+ } else { |
+ cb_data->callback(cb_data->object, NULL); |
+ } |
} |
extern "C" |
@@ -519,22 +525,27 @@ extern "C" |
void ChromeOSStorePolicy(const char* prop, |
StorePolicyCallback callback, |
void* delegate) { |
+ DCHECK(prop); |
DCHECK(delegate); |
CallbackData<StorePolicyCallback>* cb_data = |
new CallbackData<StorePolicyCallback>(callback, delegate); |
+ GArray* policy = g_array_new(FALSE, FALSE, 1); |
+ policy->data = const_cast<gchar*>(prop); // This just gets copied below. |
+ policy->len = strlen(prop); |
DBusGProxyCall* call_id = |
::dbus_g_proxy_begin_call(cb_data->proxy.gproxy(), |
login_manager::kSessionManagerStorePolicy, |
&StorePolicyNotify, |
cb_data, |
&DeleteCallbackData<StorePolicyCallback>, |
- G_TYPE_STRING, prop, |
+ DBUS_TYPE_G_UCHAR_ARRAY, policy, |
G_TYPE_INVALID); |
if (!call_id) { |
LOG(ERROR) << "StorePolicy async call failed"; |
delete cb_data; |
callback(delegate, false); |
} |
+ g_array_free(policy, FALSE); |
} |
} // namespace chromeos |