Skip to content

Commit d4e9b08

Browse files
committed
fix: don't try to free blocks that not owned by the BlockWrapper
1 parent de77365 commit d4e9b08

File tree

3 files changed

+16
-7
lines changed

3 files changed

+16
-7
lines changed

NativeScript/runtime/DataWrapper.h

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -556,25 +556,32 @@ class AnonymousFunctionWrapper: public BaseDataWrapper {
556556

557557
class BlockWrapper: public BaseDataWrapper {
558558
public:
559-
BlockWrapper(void* block, const TypeEncoding* typeEncoding)
559+
BlockWrapper(void* block, const TypeEncoding* typeEncoding, bool ownsBlock)
560560
: block_(block),
561-
typeEncoding_(typeEncoding) {
561+
typeEncoding_(typeEncoding),
562+
ownsBlock_(ownsBlock) {
562563
}
563-
564+
564565
const WrapperType Type() {
565566
return WrapperType::Block;
566567
}
567568

568569
void* Block() {
569570
return this->block_;
570571
}
571-
572+
572573
const TypeEncoding* Encodings() {
573574
return this->typeEncoding_;
574575
}
576+
577+
bool OwnsBlock() {
578+
return this->ownsBlock_;
579+
}
580+
575581
private:
576582
void* block_;
577583
const TypeEncoding* typeEncoding_;
584+
bool ownsBlock_;
578585
};
579586

580587
class FunctionReferenceTypeWrapper: public BaseDataWrapper {

NativeScript/runtime/Interop.mm

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -431,7 +431,7 @@ inline bool isBool() {
431431
MethodCallbackWrapper* userData = new MethodCallbackWrapper(isolate, poCallback, 1, argsCount, blockTypeEncoding);
432432
blockPtr = Interop::CreateBlock(1, argsCount, blockTypeEncoding, ArgConverter::MethodCallback, userData);
433433

434-
BlockWrapper* wrapper = new BlockWrapper((void*)blockPtr, blockTypeEncoding);
434+
BlockWrapper* wrapper = new BlockWrapper((void*)blockPtr, blockTypeEncoding, false);
435435
tns::SetValue(isolate, arg.As<v8::Function>(), wrapper);
436436
}
437437

@@ -947,7 +947,7 @@ inline bool isBool() {
947947
return callback;
948948
}
949949

950-
BlockWrapper* blockWrapper = new BlockWrapper(block, typeEncoding);
950+
BlockWrapper* blockWrapper = new BlockWrapper(block, typeEncoding, true);
951951
Local<External> ext = External::New(isolate, blockWrapper);
952952
Local<v8::Function> callback;
953953

NativeScript/runtime/ObjectManager.mm

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -103,7 +103,9 @@
103103
}
104104
case WrapperType::Block: {
105105
BlockWrapper* blockWrapper = static_cast<BlockWrapper*>(wrapper);
106-
std::free(blockWrapper->Block());
106+
if(!blockWrapper->OwnsBlock()) {
107+
std::free(blockWrapper->Block());
108+
}
107109
break;
108110
}
109111
case WrapperType::Reference: {

0 commit comments

Comments
 (0)