[nfc] Fixing memory management for messages and records 01/258501/3
authorPiotr Kosko/Tizen API (PLT) /SRPOL/Engineer/Samsung Electronics <p.kosko@samsung.com>
Wed, 19 May 2021 06:23:11 +0000 (08:23 +0200)
committerPiotr Kosko/Tizen API (PLT) /SRPOL/Engineer/Samsung Electronics <p.kosko@samsung.com>
Wed, 19 May 2021 11:03:56 +0000 (13:03 +0200)
Should fix Coverity issues:
1227523
1227594
1228259
1228588
1229210
1229523
1229587

[Verification] Code compiles without errors.

Change-Id: I07813a855ce2d335fe783956a7af6f340a314602

src/nfc/nfc_adapter.cc
src/nfc/nfc_message_utils.cc

index 65c87c41a670807b613172724b15b5457905ebb5..05e066933701a33d2fe8de5950c5552363fbb085 100644 (file)
@@ -26,6 +26,7 @@
 #include "common/extension.h"
 #include "common/logger.h"
 #include "common/platform_exception.h"
+#include "common/scope_exit.h"
 #include "common/tools.h"
 #include "nfc/aid_data.h"
 #include "nfc/defs.h"
@@ -1234,15 +1235,15 @@ PlatformResult NFCAdapter::TagTransceive(int tag_id, const picojson::value& args
 PlatformResult NFCAdapter::GetCachedMessage(picojson::object& out) {
   ScopeLogger();
   nfc_ndef_message_h message_handle = NULL;
+  SCOPE_EXIT { NFCMessageUtils::RemoveMessageHandle(message_handle); };
   int result = nfc_manager_get_cached_message(&message_handle);
   if (NFC_ERROR_INVALID_NDEF_MESSAGE == result || NFC_ERROR_NO_NDEF_MESSAGE == result) {
     LoggerE("Error: %d", result);
-    NFCMessageUtils::RemoveMessageHandle(message_handle);
+
     return PlatformResult(ErrorCode::NO_ERROR);
   }
   if (NFC_ERROR_NONE != result) {
     LoggerE("Failed to get cached message: %d", result);
-    NFCMessageUtils::RemoveMessageHandle(message_handle);
     return NFCUtil::CodeToResult(result, "Failed to get cached message");
   }
   unsigned char* raw_data = NULL;
@@ -1250,17 +1251,14 @@ PlatformResult NFCAdapter::GetCachedMessage(picojson::object& out) {
   if (NFC_ERROR_NONE != nfc_ndef_message_get_rawdata(message_handle, &raw_data, &size)) {
     LoggerE("Unknown error while getting message.");
     free(raw_data);
-    NFCMessageUtils::RemoveMessageHandle(message_handle);
     return PlatformResult(ErrorCode::NO_ERROR);
   }
   PlatformResult ret = NFCMessageUtils::ReportNdefMessageFromData(raw_data, size, out);
   free(raw_data);
   if (ret.IsError()) {
     LoggerE("Error: %s", ret.message().c_str());
-    NFCMessageUtils::RemoveMessageHandle(message_handle);
     return ret;
   }
-  NFCMessageUtils::RemoveMessageHandle(message_handle);
   return PlatformResult(ErrorCode::NO_ERROR);
 }
 
index f231cf80bbebeeedbb27502ecc8a57bc8b647f57..54235d05b7401e17cd141da16e9d06b215ac4992 100644 (file)
@@ -21,6 +21,7 @@
 #include "common/converter.h"
 #include "common/logger.h"
 #include "common/platform_exception.h"
+#include "common/scope_exit.h"
 #include "nfc/nfc_util.h"
 
 using namespace common;
@@ -80,14 +81,8 @@ static PlatformResult getTnfFromHandle(nfc_ndef_record_h handle, nfc_ndef_messag
   nfc_record_tnf_e record_tnf;
   int result = nfc_ndef_record_get_tnf(handle, &record_tnf);
   if (NFC_ERROR_NONE != result) {
-    LoggerE("Can't get record's tnf: %d, %s", result, NFCUtil::getNFCErrorMessage(result).c_str());
-    // once record handle must be released - from inherited classes constructors
-    // once record handle cannot be released - from base class constructor
-    if (NULL == message_handle) {
-      removeRecordHandle(handle);
-    } else {
-      NFCMessageUtils::RemoveMessageHandle(message_handle);
-    }
+    LoggerE("Can't get record's tnf: %d, %s", result,
+            NFCUtil::getNFCErrorMessage(result).c_str());
     return NFCUtil::CodeToResult(result, "Can't get record's tnf");
   }
 
@@ -104,14 +99,8 @@ static PlatformResult getTypeNameFromHandle(nfc_ndef_record_h handle,
 
   result = nfc_ndef_record_get_type(handle, &type_name, &type_size);
   if (NFC_ERROR_NONE != result) {
-    LoggerE("Can't get record's type: %d, %s", result, NFCUtil::getNFCErrorMessage(result).c_str());
-    // once record handle must be released - from inherited classes constructors
-    // once record handle cannot be released - from base class constructor
-    if (NULL == message_handle) {
-      removeRecordHandle(handle);
-    } else {
-      NFCMessageUtils::RemoveMessageHandle(message_handle);
-    }
+    LoggerE("Can't get record's type: %d, %s", result,
+            NFCUtil::getNFCErrorMessage(result).c_str());
     return NFCUtil::CodeToResult(result, "Can't get record's type");
   }
   *type = NFCUtil::ToVector(type_name, type_size);
@@ -126,14 +115,8 @@ static PlatformResult getIdFromHandle(nfc_ndef_record_h handle, nfc_ndef_message
 
   result = nfc_ndef_record_get_id(handle, &tmp_id, &id_size);
   if (NFC_ERROR_NONE != result) {
-    LoggerE("Can't get record's id: %d, %s", result, NFCUtil::getNFCErrorMessage(result).c_str());
-    // once record handle must be released - from inherited classes constructors
-    // once record handle cannot be released - from base class constructor
-    if (NULL == message_handle) {
-      removeRecordHandle(handle);
-    } else {
-      NFCMessageUtils::RemoveMessageHandle(message_handle);
-    }
+    LoggerE("Can't get record's id: %d, %s", result,
+            NFCUtil::getNFCErrorMessage(result).c_str());
     return NFCUtil::CodeToResult(result, "Can't get record's id");
   }
 
@@ -153,13 +136,6 @@ static PlatformResult getPayloadFromHandle(nfc_ndef_record_h handle,
   if (NFC_ERROR_NONE != result) {
     LoggerE("Can't get record's payload: %d, %s", result,
             NFCUtil::getNFCErrorMessage(result).c_str());
-    // once record handle must be released - from inherited classes constructors
-    // once record handle cannot be released - from base class constructor
-    if (NULL == message_handle) {
-      removeRecordHandle(handle);
-    } else {
-      NFCMessageUtils::RemoveMessageHandle(message_handle);
-    }
     return NFCUtil::CodeToResult(result, "Can't get record's payload");
   }
 
@@ -195,19 +171,18 @@ PlatformResult NFCMessageUtils::ToNdefRecords(const nfc_ndef_message_h message,
     if (NFC_ERROR_NONE != result) {
       LoggerE("Can't get record count: %d, %s", result,
               NFCUtil::getNFCErrorMessage(result).c_str());
-      RemoveMessageHandle(message);
       return NFCUtil::CodeToResult(result, "Can't get record count");
     }
     for (int i = 0; i < count; ++i) {
       array.push_back(picojson::value(picojson::object()));
       picojson::object& record_obj = array.back().get<picojson::object>();
 
-      nfc_ndef_record_h record_handle = NULL;
+      nfc_ndef_record_h record_handle = nullptr;
+      // record_handle is managed by framework, does not need to release it
       int result = nfc_ndef_message_get_record(message, i, &record_handle);
       if (NFC_ERROR_NONE != result) {
         LoggerE("Can't get Ndef Record: %d, %s", result,
                 NFCUtil::getNFCErrorMessage(result).c_str());
-        RemoveMessageHandle(message);
         return NFCUtil::CodeToResult(result, "Can't get Ndef Record");
       }
       short tnf;
@@ -268,6 +243,7 @@ PlatformResult NFCMessageUtils::ReportNdefMessageFromData(unsigned char* data, u
                                                           picojson::object& out) {
   ScopeLogger();
   nfc_ndef_message_h message = NULL;
+  SCOPE_EXIT { RemoveMessageHandle(message); };
 
   int result = nfc_ndef_message_create_from_rawdata(&message, data, size);
   if (NFC_ERROR_NONE != result) {
@@ -280,14 +256,11 @@ PlatformResult NFCMessageUtils::ReportNdefMessageFromData(unsigned char* data, u
 
   if (ret.IsError()) {
     LoggerE("Error: %s", ret.message().c_str());
-    RemoveMessageHandle(message);
     return ret;
   }
 
   out.insert(std::make_pair("records", picojson::value(records_array)));
 
-  RemoveMessageHandle(message);
-
   return PlatformResult(ErrorCode::NO_ERROR);
 }
 
@@ -344,7 +317,6 @@ static PlatformResult NdefRecordGetHandle(picojson::value& record,
       &ndef_record_handle, tnf, type.get(), type_size > BYTE_ARRAY_MAX ? BYTE_ARRAY_MAX : type_size,
       id.get(), id_size > BYTE_ARRAY_MAX ? BYTE_ARRAY_MAX : id_size, payload.get(), payload_size);
   if (NFC_ERROR_NONE != result) {
-    removeRecordHandle(ndef_record_handle);
     LoggerE("Can't create Ndef Record: %d, %s", result,
             NFCUtil::getNFCErrorMessage(result).c_str());
     return NFCUtil::CodeToResult(result, "Can't create Ndef Record");
@@ -361,35 +333,37 @@ PlatformResult NFCMessageUtils::NDEFMessageToStruct(const picojson::array& recor
     return PlatformResult(ErrorCode::NO_ERROR);
   }
 
-  nfc_ndef_message_h ndef_message;
+  nfc_ndef_message_h ndef_message = nullptr;
   int result = nfc_ndef_message_create(&ndef_message);
-
   if (NFC_ERROR_NONE != result) {
-    RemoveMessageHandle(ndef_message);
     LoggerE("Can't create Ndef Message: %d, %s", result,
             NFCUtil::getNFCErrorMessage(result).c_str());
     return NFCUtil::CodeToResult(result, "Can't create Ndef Message");
   }
+  std::unique_ptr<std::remove_pointer<nfc_ndef_message_h>::type,
+                  void (*)(nfc_ndef_message_h)>
+      ndef_message_ptr(ndef_message, &RemoveMessageHandle);
 
   for (picojson::value record : records_array) {
-    nfc_ndef_record_h record_handle;
+    nfc_ndef_record_h record_handle = nullptr;
     PlatformResult ret = NdefRecordGetHandle(record, &record_handle);
 
     if (ret.IsError()) {
       LoggerE("Error: %s", ret.message().c_str());
-      RemoveMessageHandle(ndef_message);
       return ret;
     }
 
     result = nfc_ndef_message_append_record(ndef_message, record_handle);
+    // in case of success record_handle is handled by framework and does not need to be released
     if (NFC_ERROR_NONE != result) {
       LoggerE("record can't be inserted: %d, %s", result,
               NFCUtil::getNFCErrorMessage(result).c_str());
       removeRecordHandle(record_handle);
-      RemoveMessageHandle(ndef_message);
       return NFCUtil::CodeToResult(result, "Invalid NDEF Message");
     }
   }
+  //  release ownership before returning a pointer
+  ndef_message_ptr.release();
   *message = ndef_message;
   return PlatformResult(ErrorCode::NO_ERROR);
 }
@@ -511,10 +485,12 @@ PlatformResult NFCMessageUtils::ReportNdefRecordFromMessage(nfc_ndef_message_h m
                                                             picojson::object& out) {
   ScopeLogger();
   nfc_ndef_record_h record_handle = NULL;
-  int result = nfc_ndef_message_get_record(message_handle, index, &record_handle);
+  // record_handle will be managed by framework, does not need to be released
+  int result =
+      nfc_ndef_message_get_record(message_handle, index, &record_handle);
   if (NFC_ERROR_NONE != result) {
-    LoggerE("Can't get NdefRecord: %d, %s", result, NFCUtil::getNFCErrorMessage(result).c_str());
-    RemoveMessageHandle(message_handle);
+    LoggerE("Can't get NdefRecord: %d, %s", result,
+            NFCUtil::getNFCErrorMessage(result).c_str());
     return NFCUtil::CodeToResult(result, "Can't get NdefRecord");
   }
 
@@ -533,7 +509,8 @@ PlatformResult NFCMessageUtils::ReportNDEFRecord(const picojson::value& args,
   for (ssize_t i = 0; i < size; i++) {
     data[i] = (int)raw_data[i].get<double>();
   }
-  nfc_ndef_message_h message_handle = NULL;
+  nfc_ndef_message_h message_handle = nullptr;
+  SCOPE_EXIT { RemoveMessageHandle(message_handle); };
 
   int result = nfc_ndef_message_create_from_rawdata(&message_handle, data.get(), size);
   if (NFC_ERROR_NONE != result) {
@@ -545,15 +522,13 @@ PlatformResult NFCMessageUtils::ReportNDEFRecord(const picojson::value& args,
   int count;
   result = nfc_ndef_message_get_record_count(message_handle, &count);
   if (NFC_ERROR_NONE != result) {
-    LoggerE("Can't get record count: %d, %s", result, NFCUtil::getNFCErrorMessage(result).c_str());
-    RemoveMessageHandle(message_handle);
+    LoggerE("Can't get record count: %d, %s", result,
+            NFCUtil::getNFCErrorMessage(result).c_str());
     return NFCUtil::CodeToResult(result, "Can't get record count");
   }
 
   PlatformResult ret = ReportNdefRecordFromMessage(message_handle, 0, out);
 
-  RemoveMessageHandle(message_handle);
-
   if (ret.IsError()) {
     LoggerE("Error: %s", ret.message().c_str());
     return ret;
@@ -569,8 +544,8 @@ static PlatformResult getTextFromHandle(nfc_ndef_record_h handle, nfc_ndef_messa
   char* tmp_text = NULL;
   int result = nfc_ndef_record_get_text(handle, &tmp_text);
   if (NFC_ERROR_NONE != result) {
-    LoggerE("Can't get record's text: %d, %s", result, NFCUtil::getNFCErrorMessage(result).c_str());
-    NFCMessageUtils::RemoveMessageHandle(message_handle);
+    LoggerE("Can't get record's text: %d, %s", result,
+            NFCUtil::getNFCErrorMessage(result).c_str());
     return NFCUtil::CodeToResult(result, "Can't get record's text");
   }
 
@@ -590,7 +565,6 @@ static PlatformResult getLanguageCodeFromHandle(nfc_ndef_record_h handle,
   if (NFC_ERROR_NONE != result) {
     LoggerE("Can't get record's languageCode: %d, %s", result,
             NFCUtil::getNFCErrorMessage(result).c_str());
-    NFCMessageUtils::RemoveMessageHandle(message_handle);
     return NFCUtil::CodeToResult(result, "Can't get record's languageCode");
   }
 
@@ -610,7 +584,6 @@ static PlatformResult getEncodingFromHandle(nfc_ndef_record_h handle,
   if (NFC_ERROR_NONE != result) {
     LoggerE("Can't get record's encoding: %d, %s", result,
             NFCUtil::getNFCErrorMessage(result).c_str());
-    NFCMessageUtils::RemoveMessageHandle(message_handle);
     return NFCUtil::CodeToResult(result, "Can't get record's encoding");
   }
 
@@ -625,6 +598,7 @@ static PlatformResult ReportNDEFRecordTextFromText(const std::string& text,
   ScopeLogger();
   nfc_encode_type_e encoding = convertToNfcEncodeUTF(encoding_str);
   nfc_ndef_record_h handle = NULL;
+  SCOPE_EXIT { removeRecordHandle(handle); };
 
   int result = nfc_ndef_record_create_text(&handle, text.c_str(), language_code.c_str(), encoding);
   if (NFC_ERROR_NONE != result) {
@@ -661,7 +635,6 @@ static PlatformResult ReportNDEFRecordTextFromText(const std::string& text,
   // constructing json
   ConstructRecordJson(_tnf, _type_name, _id, _payload, out);
 
-  removeRecordHandle(handle);
   return PlatformResult(ErrorCode::NO_ERROR);
 }
 
@@ -670,11 +643,12 @@ PlatformResult NFCMessageUtils::ReportNdefRecordTextFromMessage(nfc_ndef_message
                                                                 picojson::object& out) {
   ScopeLogger();
   nfc_ndef_record_h record_handle = NULL;
-  // This function just return the pointer of record.
+  // This function just return the pointer of record. do not release
+  // record_handle
   int result = nfc_ndef_message_get_record(message_handle, index, &record_handle);
   if (NFC_ERROR_NONE != result) {
-    LoggerE("Can't get Ndef Record: %d, %s", result, NFCUtil::getNFCErrorMessage(result).c_str());
-    RemoveMessageHandle(message_handle);
+    LoggerE("Can't get Ndef Record: %d, %s", result,
+            NFCUtil::getNFCErrorMessage(result).c_str());
     return NFCUtil::CodeToResult(result, "Can't get Ndef Record");
   }
 
@@ -729,8 +703,8 @@ static PlatformResult getURIFromHandle(nfc_ndef_record_h handle, nfc_ndef_messag
   char* uri = NULL;
   int result = nfc_ndef_record_get_uri(handle, &uri);
   if (NFC_ERROR_NONE != result || !uri) {
-    LoggerE("Can't get record's uri: %d, %s", result, NFCUtil::getNFCErrorMessage(result).c_str());
-    NFCMessageUtils::RemoveMessageHandle(message_handle);
+    LoggerE("Can't get record's uri: %d, %s", result,
+            NFCUtil::getNFCErrorMessage(result).c_str());
     return NFCUtil::CodeToResult(result, "Can't get record's uri");
   }
 
@@ -744,6 +718,7 @@ static PlatformResult getURIFromHandle(nfc_ndef_record_h handle, nfc_ndef_messag
 static PlatformResult ReportNDEFRecordURIFromURI(const std::string& uri, picojson::object& out) {
   ScopeLogger();
   nfc_ndef_record_h handle = NULL;
+  SCOPE_EXIT { removeRecordHandle(handle); };
 
   int result = nfc_ndef_record_create_uri(&handle, uri.c_str());
   if (NFC_ERROR_NONE != result) {
@@ -780,7 +755,6 @@ static PlatformResult ReportNDEFRecordURIFromURI(const std::string& uri, picojso
   // constructing json
   ConstructRecordJson(_tnf, _type_name, _id, _payload, out);
 
-  removeRecordHandle(handle);
   return PlatformResult(ErrorCode::NO_ERROR);
 }
 
@@ -789,11 +763,12 @@ PlatformResult NFCMessageUtils::ReportNdefRecordURIFromMessage(nfc_ndef_message_
                                                                picojson::object& out) {
   ScopeLogger();
   nfc_ndef_record_h record_handle = NULL;
-  // This function just return the pointer of record.
+  // This function just return the pointer of record. do not remove
+  // record_handle
   int result = nfc_ndef_message_get_record(message_handle, index, &record_handle);
   if (NFC_ERROR_NONE != result) {
-    LoggerE("Can't get Ndef Record: %d, %s", result, NFCUtil::getNFCErrorMessage(result).c_str());
-    RemoveMessageHandle(message_handle);
+    LoggerE("Can't get Ndef Record: %d, %s", result,
+            NFCUtil::getNFCErrorMessage(result).c_str());
     return NFCUtil::CodeToResult(result, "Can't get Ndef Record");
   }
 
@@ -829,7 +804,6 @@ static PlatformResult getMimeTypeFromHandle(nfc_ndef_record_h handle,
   if (NFC_ERROR_NONE != result) {
     LoggerE("Can't get record's mime_type: %d, %s", result,
             NFCUtil::getNFCErrorMessage(result).c_str());
-    NFCMessageUtils::RemoveMessageHandle(message_handle);
     return NFCUtil::CodeToResult(result, "Can't get record's mime_type");
   }
 
@@ -845,11 +819,12 @@ PlatformResult NFCMessageUtils::ReportNdefRecordMediaFromMessage(nfc_ndef_messag
                                                                  picojson::object& out) {
   ScopeLogger();
   nfc_ndef_record_h record_handle = NULL;
-  // This function just return the pointer of record.
+  // This function just return the pointer of record. do not remove
+  // record_handle
   int result = nfc_ndef_message_get_record(message_handle, index, &record_handle);
   if (NFC_ERROR_NONE != result) {
-    LoggerE("Can't get Ndef Record: %d, %s", result, NFCUtil::getNFCErrorMessage(result).c_str());
-    RemoveMessageHandle(message_handle);
+    LoggerE("Can't get Ndef Record: %d, %s", result,
+            NFCUtil::getNFCErrorMessage(result).c_str());
     return NFCUtil::CodeToResult(result, "Can't get Ndef Record");
   }
 
@@ -904,6 +879,7 @@ PlatformResult NFCMessageUtils::ReportNDEFRecordMedia(const picojson::value& arg
   }
 
   nfc_ndef_record_h handle = NULL;
+  SCOPE_EXIT { removeRecordHandle(handle); };
 
   short _tnf = NFC_RECORD_TNF_UNKNOWN;
   UCharVector _type_name;
@@ -942,7 +918,6 @@ PlatformResult NFCMessageUtils::ReportNDEFRecordMedia(const picojson::value& arg
   // constructing json
   ConstructRecordJson(_tnf, _type_name, _id, _payload, out);
 
-  removeRecordHandle(handle);
   return PlatformResult(ErrorCode::NO_ERROR);
 }