Fix bugs about getting and setting raw data 16/282216/1
authorHwankyu Jhun <h.jhun@samsung.com>
Wed, 28 Sep 2022 10:27:29 +0000 (10:27 +0000)
committerHwankyu Jhun <h.jhun@samsung.com>
Wed, 28 Sep 2022 10:27:29 +0000 (10:27 +0000)
Unfortunately, there is a bug about the raw data of the parcel.
When the rpc_port_parcel_get_raw() is called, the function allocates a
tizen_base::Parcel to set the raw data internally.

Change-Id: I4297f7fab5ba144bafd17366b518627bfbd1e5d1
Signed-off-by: Hwankyu Jhun <h.jhun@samsung.com>
src/parcel-internal.cc
src/parcel-internal.hh
src/rpc-port-parcel.cc

index 75f5805..5cb299d 100644 (file)
@@ -58,5 +58,13 @@ parcel_h Parcel::GetHandle() const {
   return static_cast<parcel_h>(const_cast<tizen_base::Parcel*>(&handle_));
 }
 
+void Parcel::SetRawParcel(tizen_base::Parcel* raw_parcel) {
+  raw_parcel_.reset(raw_parcel);
+}
+
+tizen_base::Parcel* Parcel::GetRawParcel() const {
+  return raw_parcel_.get();
+}
+
 }  // namespace internal
 }  // namespace rpc_port
index 6922003..6c907b8 100644 (file)
 #include <parcel.h>
 
 #include <parcel.hh>
-
 #include <parcelable.hh>
 
+#include <memory>
+
 #include "parcel-header-internal.hh"
 
 namespace rpc_port {
@@ -39,9 +40,13 @@ class Parcel : public tizen_base::Parcelable {
   const ParcelHeader* GetParcelHeader();
   parcel_h GetHandle() const;
 
+  void SetRawParcel(tizen_base::Parcel* raw_parcel);
+  tizen_base::Parcel* GetRawParcel() const;
+
  private:
   ParcelHeader header_;
   tizen_base::Parcel handle_;
+  std::unique_ptr<tizen_base::Parcel> raw_parcel_ { nullptr };
 };
 
 }  // namespace internal
index 86af7b3..12782ee 100644 (file)
@@ -415,9 +415,10 @@ RPC_API int rpc_port_parcel_to_array(rpc_port_parcel_h h, void** array,
     return RPC_PORT_ERROR_INVALID_PARAMETER;
 
   auto* parcel = static_cast<internal::Parcel*>(h);
-  void* raw = nullptr;
-  uint32_t raw_size = 0;
-  parcel_get_raw(parcel->GetHandle(), &raw, &raw_size);
+  tizen_base::Parcel raw_parcel;
+  raw_parcel.WriteParcelable(*parcel);
+  void* raw = raw_parcel.GetData();
+  uint32_t raw_size = raw_parcel.GetDataSize();;
   if (raw_size == 0) {
     _E("raw_size is zero");
     return RPC_PORT_ERROR_IO_ERROR;
@@ -440,7 +441,8 @@ RPC_API int rpc_port_parcel_from_array(rpc_port_parcel_h h, const void* array,
 
   auto* parcel = static_cast<internal::Parcel*>(h);
   uint32_t valid_size = size & UINT32_MAX;
-  parcel_reset(parcel->GetHandle(), array, valid_size);
+  tizen_base::Parcel raw_parcel(array, valid_size);
+  raw_parcel.ReadParcelable(parcel);
   return RPC_PORT_ERROR_NONE;
 }
 
@@ -517,12 +519,18 @@ RPC_API int rpc_port_parcel_get_raw(rpc_port_parcel_h h, void** raw,
     return RPC_PORT_ERROR_INVALID_PARAMETER;
 
   auto* parcel = static_cast<internal::Parcel*>(h);
-  void* raw_data = nullptr;
-  uint32_t raw_size = 0;
-  parcel_get_raw(parcel->GetHandle(), &raw_data, &raw_size);
+  auto* raw_parcel = new (std::nothrow) tizen_base::Parcel();
+  if (raw_parcel != nullptr) {
+    raw_parcel->WriteParcelable(*parcel);
+    parcel->SetRawParcel(raw_parcel);
+    *raw = raw_parcel->GetData();
+    *size = static_cast<unsigned int>(raw_parcel->GetDataSize());
+  } else {
+    _E("Out of memory");
+    *raw = nullptr;
+    *size = 0;
+  }
 
-  *raw = raw_data;
-  *size = static_cast<unsigned int>(raw_size);
   return RPC_PORT_ERROR_NONE;
 }