Skip to content

Commit f946828

Browse files
authored
fix: memory leak when marshalling C string parameters (#127)
1 parent 57ec2ec commit f946828

File tree

4 files changed

+66
-3
lines changed

4 files changed

+66
-3
lines changed

NativeScript/runtime/Interop.mm

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
#include "ExtVector.h"
1818
#include "SymbolIterator.h"
1919
#include "UnmanagedType.h"
20+
#include "OneByteStringResource.h"
2021

2122
using namespace v8;
2223

@@ -165,9 +166,19 @@
165166
Interop::SetValue(dest, selector);
166167
} else if (typeEncoding->type == BinaryTypeEncodingType::CStringEncoding) {
167168
if (arg->IsString()) {
168-
v8::String::Utf8Value utf8Value(isolate, arg);
169-
const char* strCopy = strdup(*utf8Value);
170-
Interop::SetValue(dest, strCopy);
169+
const char* value = nullptr;
170+
Local<v8::String> strArg = arg.As<v8::String>();
171+
if (strArg->IsExternalOneByte()) {
172+
const v8::String::ExternalOneByteStringResource* resource = strArg->GetExternalOneByteStringResource();
173+
value = resource->data();
174+
} else {
175+
v8::String::Utf8Value utf8Value(isolate, arg);
176+
value = strdup(*utf8Value);
177+
OneByteStringResource* resource = new OneByteStringResource(value, strArg->Length());
178+
bool success = v8::String::NewExternalOneByte(isolate, resource).ToLocal(&arg);
179+
tns::Assert(success, isolate);
180+
}
181+
Interop::SetValue(dest, value);
171182
} else {
172183
BaseDataWrapper* wrapper = tns::GetValue(isolate, arg);
173184
if (wrapper == nullptr) {
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
#include "OneByteStringResource.h"
2+
3+
using namespace v8;
4+
5+
namespace tns {
6+
7+
OneByteStringResource::OneByteStringResource(const char* data, size_t length):
8+
data_(data), length_(length) {
9+
}
10+
11+
OneByteStringResource::~OneByteStringResource() {
12+
delete this->data_;
13+
}
14+
15+
const char* OneByteStringResource::data() const {
16+
return this->data_;
17+
}
18+
19+
size_t OneByteStringResource::length() const {
20+
return this->length_;
21+
}
22+
23+
}
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
#ifndef OneByteStringResource_h
2+
#define OneByteStringResource_h
3+
4+
#include "Common.h"
5+
6+
namespace tns {
7+
8+
class OneByteStringResource : public v8::String::ExternalOneByteStringResource {
9+
public:
10+
OneByteStringResource(const char* data, size_t length);
11+
~OneByteStringResource() override;
12+
const char* data() const override;
13+
size_t length() const override;
14+
private:
15+
const char* data_;
16+
size_t length_;
17+
};
18+
19+
}
20+
21+
#endif /* OneByteStringResource_h */

v8ios.xcodeproj/project.pbxproj

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,8 @@
1212
C205257F2577D6F900C12A5C /* NativeScript.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = C2DDEB32229EAB3B00345BFE /* NativeScript.framework */; };
1313
C20525802577D6F900C12A5C /* NativeScript.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = C2DDEB32229EAB3B00345BFE /* NativeScript.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; };
1414
C20525A82577D86600C12A5C /* TNSWidgets.xcframework in Frameworks */ = {isa = PBXBuildFile; fileRef = C20525A72577D86600C12A5C /* TNSWidgets.xcframework */; };
15+
C20AB5E626E1015300E2B41D /* OneByteStringResource.cpp in Sources */ = {isa = PBXBuildFile; fileRef = C20AB5E426E1015200E2B41D /* OneByteStringResource.cpp */; };
16+
C20AB5E726E1015300E2B41D /* OneByteStringResource.h in Headers */ = {isa = PBXBuildFile; fileRef = C20AB5E526E1015200E2B41D /* OneByteStringResource.h */; };
1517
C2229973235449B400C1DFD6 /* InspectorServer.mm in Sources */ = {isa = PBXBuildFile; fileRef = C2229971235449B300C1DFD6 /* InspectorServer.mm */; settings = {COMPILER_FLAGS = "-fobjc-arc"; }; };
1618
C2229974235449B400C1DFD6 /* InspectorServer.h in Headers */ = {isa = PBXBuildFile; fileRef = C2229972235449B400C1DFD6 /* InspectorServer.h */; };
1719
C2229977235492EC00C1DFD6 /* v8-ns-debugger-agent-impl.h in Headers */ = {isa = PBXBuildFile; fileRef = C2229975235492EC00C1DFD6 /* v8-ns-debugger-agent-impl.h */; };
@@ -541,6 +543,8 @@
541543
2B7EA6AE2353477000E5184E /* NativeScriptException.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = NativeScriptException.h; sourceTree = "<group>"; };
542544
C2003F9E23FA78CD0043B815 /* TNSDerivedClass.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = TNSDerivedClass.h; sourceTree = "<group>"; };
543545
C20525A72577D86600C12A5C /* TNSWidgets.xcframework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcframework; path = TNSWidgets.xcframework; sourceTree = "<group>"; };
546+
C20AB5E426E1015200E2B41D /* OneByteStringResource.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = OneByteStringResource.cpp; sourceTree = "<group>"; };
547+
C20AB5E526E1015200E2B41D /* OneByteStringResource.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = OneByteStringResource.h; sourceTree = "<group>"; };
544548
C2229971235449B300C1DFD6 /* InspectorServer.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; path = InspectorServer.mm; sourceTree = "<group>"; };
545549
C2229972235449B400C1DFD6 /* InspectorServer.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = InspectorServer.h; sourceTree = "<group>"; };
546550
C2229975235492EC00C1DFD6 /* v8-ns-debugger-agent-impl.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "v8-ns-debugger-agent-impl.h"; sourceTree = "<group>"; };
@@ -1893,6 +1897,8 @@
18931897
C266567922AA630F00EE15CC /* NSDataAdapter.mm */,
18941898
C2DDEB83229EAC8300345BFE /* ObjectManager.h */,
18951899
C2DDEB86229EAC8300345BFE /* ObjectManager.mm */,
1900+
C20AB5E526E1015200E2B41D /* OneByteStringResource.h */,
1901+
C20AB5E426E1015200E2B41D /* OneByteStringResource.cpp */,
18961902
C266569222AFFF7E00EE15CC /* Pointer.h */,
18971903
C266569122AFFF7E00EE15CC /* Pointer.cpp */,
18981904
C2D7E9D323F42C1100DB289C /* PromiseProxy.h */,
@@ -1977,6 +1983,7 @@
19771983
C22536B5241A318900192740 /* ffitarget.h in Headers */,
19781984
C2D7E9CF23F4294800DB289C /* export-template.h in Headers */,
19791985
C2DDEB97229EAC8300345BFE /* Metadata.h in Headers */,
1986+
C20AB5E726E1015300E2B41D /* OneByteStringResource.h in Headers */,
19801987
C2DDEBAC229EAC8300345BFE /* ObjectManager.h in Headers */,
19811988
C247C32E22F828E3001D2CA2 /* base64.h in Headers */,
19821989
C247C35322F828E3001D2CA2 /* v8-runtime-agent-impl.h in Headers */,
@@ -2629,6 +2636,7 @@
26292636
buildActionMask = 2147483647;
26302637
files = (
26312638
C247C36822F828E3001D2CA2 /* Console.cpp in Sources */,
2639+
C20AB5E626E1015300E2B41D /* OneByteStringResource.cpp in Sources */,
26322640
C247C36422F828E3001D2CA2 /* Log.cpp in Sources */,
26332641
C247C34922F828E3001D2CA2 /* v8-string-conversions.cc in Sources */,
26342642
C247C38C22F828E3001D2CA2 /* v8-network-agent-impl.cpp in Sources */,

0 commit comments

Comments
 (0)