[Contact] Fixing bug when adding Contact to AddressBook 59/138659/1
authorSzymon Jastrzebski <s.jastrzebsk@partner.samsung.com>
Thu, 13 Jul 2017 06:19:53 +0000 (08:19 +0200)
committerSzymon Jastrzebski <s.jastrzebsk@partner.samsung.com>
Thu, 13 Jul 2017 06:20:54 +0000 (08:20 +0200)
There was a bug, which caused application to crash everytime
when adding more than one nickname.
In every iteration of nicknames, the same nickname-handler
was added to parent-handler. The crash happened during attempting
to free parent-handler with all its children (double free).

Contact TCT passed 100%.

Change-Id: Ibaddf2ce17aacb6dcf40422fc0303ec5e1142089
Signed-off-by: Szymon Jastrzebski <s.jastrzebsk@partner.samsung.com>
src/contact/contact_util.cc

index bcccd3bfad99cd384fbfbebb57bd5bc4955242e9..6251ee127924795966432e887bde6a8d38052b7f 100755 (executable)
@@ -584,39 +584,29 @@ PlatformResult ExportContactNameToContactsRecord(
 
   for (auto& nickname : nicknames) {
     contacts_record_h nickname_record = nullptr;
-    err = contacts_record_get_child_record_at_p(
-        contacts_record, _contacts_contact.nickname, 0, &nickname_record);
-    if (CONTACTS_ERROR_NONE != err && nullptr == nickname_record) {
-      err = contacts_record_create(_contacts_nickname._uri, &nickname_record);
-      PlatformResult status =
-          ContactUtil::ErrorChecker(err, "Contacts record create error");
-      if (status.IsError()) {
-        LoggerE("Error: %s", status.message().c_str());
-        return status;
-      }
-
-      update = false;
+    err = contacts_record_create(_contacts_nickname._uri, &nickname_record);
+    PlatformResult status = ContactUtil::ErrorChecker(err, "Contacts record create error");
+    if (status.IsError()) {
+      LoggerE("Error: %s", status.message().c_str());
+      return status;
     }
     ContactsRecordHPtr nickname_ptr(&nickname_record, ContactsDeleter);
 
-    PlatformResult status =
-        ContactUtil::SetStrInRecord(*nickname_ptr, _contacts_nickname.name,
-                                    JsonCast<JsonString>(nickname).c_str());
+    status = ContactUtil::SetStrInRecord(*nickname_ptr, _contacts_nickname.name,
+                                         JsonCast<JsonString>(nickname).c_str());
     if (status.IsError()) {
       LoggerE("Error: %s", status.message().c_str());
       return status;
     }
 
-    if (!update) {
-      err = contacts_record_add_child_record(
-          contacts_record, _contacts_contact.nickname, *nickname_ptr);
-      PlatformResult status =
-          ContactUtil::ErrorChecker(err, "Contacts record add child error");
-      if (status.IsError()) {
-        LoggerE("Error: %s", status.message().c_str());
-        return status;
-      }
+    err = contacts_record_add_child_record(contacts_record, _contacts_contact.nickname,
+                                           *nickname_ptr);
+    status = ContactUtil::ErrorChecker(err, "Contacts record add child error");
+    if (status.IsError()) {
+      LoggerE("Error: %s", status.message().c_str());
+      return status;
     }
+
     // Do not delete record, it is passed to the platform
     nickname_ptr.release();
   }