1 /*
2  * Copyright (c) 2023 Huawei Device Co., Ltd.
3  * Licensed under the Apache License, Version 2.0 (the "License");
4  * you may not use this file except in compliance with the License.
5  * You may obtain a copy of the License at
6  *
7  * http://www.apache.org/licenses/LICENSE-2.0
8  *
9  * Unless required by applicable law or agreed to in writing, software
10  * distributed under the License is distributed on an "AS IS" BASIS,
11  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12  * See the License for the specific language governing permissions and
13  * limitations under the License.
14  */
15 
16 #include "ipc_issues.h"
17 
18 #include <memory>
19 
20 #include "message_parcel.h"
21 
22 #include "parcel_sample.h"
23 #include "remote_object_interface.h"
24 #include "remote_object_interface_stub.h"
25 #include "remote_object_interface_proxy.h"
26 
27 namespace OHOS {
28 namespace HiviewDFX {
SptrMismatch()29 int IPCIssues::SptrMismatch()
30 {
31     printf("IPCIssues::SptrMismatch begin\n");
32     {
33         MessageParcel data;
34         auto stub = new RemoteObjectInterfaceStub();
35         sptr<IRemoteObject> sendObj = stub->AsObject();
36         printf("sendObj:%p count:%d.\n", sendObj.GetRefPtr(), sendObj->GetSptrRefCount());
37 
38         sptr<IRemoteObject> sendObj2 = stub;
39         printf("sendObj2:%p count:%d.\n", sendObj2.GetRefPtr(), sendObj2->GetSptrRefCount());
40         delete stub;
41         sendObj = nullptr;
42         sendObj2 = nullptr;
43     }
44     printf("IPCIssues::SptrMismatch end\n");
45     return 0;
46 }
47 
SptrAndSharedPtrMixUsage()48 int IPCIssues::SptrAndSharedPtrMixUsage()
49 {
50     printf("IPCIssues::SptrAndSharedPtrMixUsage begin.\n");
51     {
52         auto sendObj = std::make_shared<RemoteObjectInterfaceStub>();
53         printf("sendObj:%p.\n", sendObj.get());
54         delete sendObj.get();
55         sendObj = nullptr;
56     }
57     printf("IPCIssues::SptrAndSharedPtrMixUsage end.\n");
58     return 0;
59 }
60 
ParcelReadWriteMismatch()61 int IPCIssues::ParcelReadWriteMismatch()
62 {
63     MessageParcel data;
64     if (!data.WriteInterfaceToken(RemoteObjectInterfaceProxy::GetDescriptor())) {
65         printf("Failed to write ipc interface.\n");
66         return 0;
67     }
68 
69     ParcelSample sample;
70     if (!sample.Marshalling(data)) {
71         printf("Failed to write sample content.\n");
72         return 0;
73     }
74 
75     auto stub = new RemoteObjectInterfaceStub();
76     data.WriteRemoteObject(stub->AsObject());
77     data.WriteInt32(1);
78     sptr<IRemoteObject> recvObj = data.ReadRemoteObject();
79     if (recvObj == nullptr) {
80         printf("Failed to read remote object.\n");
81     }
82 
83     sptr<ParcelSample> samplePtr = ParcelSample::Unmarshalling(data);
84     delete samplePtr.GetRefPtr();
85     samplePtr = nullptr;
86     return 0;
87 }
88 } // namespace HiviewDFX
89 } // namespace OHOS
90