Fix handling g_variant_iter_next
authorMaciej Piotrowski <m.piotrowski@samsung.com>
Tue, 13 Jan 2015 15:43:58 +0000 (16:43 +0100)
committerMaciej Piotrowski <m.piotrowski@samsung.com>
Wed, 14 Jan 2015 14:57:38 +0000 (15:57 +0100)
Arguments passed to g_variant_iter_next should be freed
in every iteration:
https://developer.gnome.org/glib/stable/glib-GVariant.html#g-variant-iter-next

src/phone/phone_instance.cc
src/system_setting/system_setting_locale.cc
src/telephony/telephony_backend_ofono.cc

index 8eba1ec..49c8b37 100644 (file)
@@ -236,7 +236,7 @@ void PhoneInstance::HandleSignal(GDBusConnection* connection,
 
     instance->SendSignal(picojson::value(signal_name), value);
   } else if (!strcmp(signal_name, "CallChanged")) {
-    const gchar* key = NULL;
+    gchar* key = NULL;
     const gchar* state = NULL;
     const gchar* line_id = NULL;
     const gchar* contact = NULL;
@@ -256,6 +256,8 @@ void PhoneInstance::HandleSignal(GDBusConnection* connection,
         contact_err = picojson::parse(contact_obj, contact,
                                       contact + strlen(contact));
       }
+      g_free(key);
+      g_variant_unref(value);
     }
     picojson::value::object o;
     o["state"] = state ? picojson::value(state) : picojson::value("");
@@ -373,7 +375,7 @@ void PhoneInstance::HandleActiveCall(const picojson::value& msg) {
     SendSyncErrorReply(UNKNOWN_ERR);
   } else {
     picojson::value::object o;
-    const gchar* key = NULL;
+    gchar* key = NULL;
     const gchar* state = NULL;
     const gchar* line_id = NULL;
     const gchar* contact = NULL;
@@ -388,6 +390,9 @@ void PhoneInstance::HandleActiveCall(const picojson::value& msg) {
         line_id = g_variant_get_string(value, NULL);
       else if (!strcmp(key, "contact"))
         contact = g_variant_get_string(value, NULL);
+
+      g_free(key);
+      g_variant_unref(value);
     }
 
     o["state"] = state ? picojson::value(state) : picojson::value("");
index 32c1009..b4f23cf 100644 (file)
@@ -60,6 +60,9 @@ std::string getLocale() {
 
   LOGGER_D("system locale is: " << locale);
 
+  std::string sublocale = std::string(locale).substr(5);
+  g_free(locale);
+
   if (local_var)
     g_variant_unref(local_var);
 
@@ -69,7 +72,7 @@ std::string getLocale() {
   if (iter)
     g_variant_iter_free(iter);
 
-  return std::string(locale).substr(5);
+  return sublocale;
 }
 
 void setLocale(const std::string& locale_str) {
index b2c19f2..a920932 100644 (file)
@@ -270,12 +270,13 @@ bool TelephonyBackend::InitService(TelephonyService* service,
   service->id = sid;
   service->protocol = "gsm";
 
-  char* key = nullptr;
+  gchar* key = nullptr;
   GVariant* value = nullptr;
   while (g_variant_iter_next(props, "{sv}", &key, &value)) {
     UpdateServiceProperty(service, key, value);
+    g_free(key);
+    g_variant_unref(value);
   }
-  g_variant_unref(value);
 
   return true;
 }
@@ -444,12 +445,13 @@ bool TelephonyBackend::InitCall(TelephonyCall* call, const std::string& cid,
   call->protocol = "gsm";
   call->duration = 0;
   call->state = kCallStateInit;
-  char* key = nullptr;
+  gchar* key = nullptr;
   GVariant* value = nullptr;
   while (g_variant_iter_next(props, "{sv}", &key, &value)) {
     UpdateCallProperty(call, key, value);
+    g_free(key);
+    g_variant_unref(value);
   }
-  g_variant_unref(value);
 
   if (!call->service) {
     // extract service id from call id
@@ -632,6 +634,7 @@ void TelephonyBackend::OnCallManagerChanged(const gchar* obj,
   while (g_variant_iter_next(prop_iter, "s", &value)) {
     const gchar* num = g_variant_get_string(value, nullptr);
     results.push_back(picojson::value(num));
+    g_variant_unref(value);
   }
   g_variant_iter_free(prop_iter);
 
@@ -893,7 +896,7 @@ bool TelephonyBackend::QueryServices() {
 
   GVariantIter* modems;
   g_variant_get(res, "(a(oa{sv}))", &modems);
-  char* path;
+  gchar* path;
   GVariantIter* props;
   while (g_variant_iter_next(modems, "(oa{sv})", &path, &props)) {
     std::string sid = IdFromDbus(path);
@@ -904,8 +907,9 @@ bool TelephonyBackend::QueryServices() {
     InitService(service, sid, props);
     if (!found)
       services_.push_back(service);
+    g_free(path);
+    g_variant_iter_free(props);
   }
-  g_variant_iter_free(props);
   g_variant_iter_free(modems);
   g_variant_unref(res);
 
@@ -1005,7 +1009,7 @@ void TelephonyBackend::GetCalls(const picojson::value& msg) {
     GVariantIter* calls;
     g_variant_get(res, "(a(oa{sv}))", &calls);
 
-    char* obj;
+    gchar* obj;
     GVariantIter* props;
     picojson::value::array results;
     while (g_variant_iter_next(calls, "(oa{sv})", &obj, &props)) {
@@ -1016,6 +1020,8 @@ void TelephonyBackend::GetCalls(const picojson::value& msg) {
         InitCall(call, cid, props);
         calls_.push_back(call);
       }
+      g_free(obj);
+      g_variant_iter_free(props);
     }
 
     for (auto c : calls_) {
@@ -1379,7 +1385,7 @@ void TelephonyBackend::CreateConference(const picojson::value& msg) {
   GVariantIter* calls;
   g_variant_get(res, "(ao)", &calls);
 
-  char* obj = nullptr;
+  gchar* obj = nullptr;
   while (g_variant_iter_next(calls, "o", &obj)) {
     std::string call_id = IdFromDbus(obj);
     TelephonyCall* call = FindCall(call_id);
@@ -1396,6 +1402,7 @@ void TelephonyBackend::CreateConference(const picojson::value& msg) {
     call->saved_state = call->state;
     call->state = kCallStateConference;  // hangup/hold/split can change state
     conf->participants.push_back(call);
+    g_free(obj);
   }
   g_variant_iter_free(calls);
 
@@ -1586,8 +1593,9 @@ void TelephonyBackend::GetEmergencyNumbers(const picojson::value& msg) {
         results.push_back(picojson::value(number));
       }
       g_variant_iter_free(num_iter);
-      g_variant_unref(value);
     }
+    g_free(key);
+    g_variant_unref(value);
   }
 
   instance_->SendSuccessReply(msg, picojson::value(results));