Skip to content

Commit 50c84f8

Browse files
Brandon-TTorwent
authored andcommitted
Fix method calling crash when passing emtpy array arguments
1 parent 0c349cc commit 50c84f8

File tree

9 files changed

+133
-100
lines changed

9 files changed

+133
-100
lines changed

RemoteInput/EIOSTypes.hxx

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -77,6 +77,7 @@ enum class EIOSCommand: std::uint32_t
7777

7878
REFLECT_CLASS_NAME,
7979
REFLECT_CLASS_TYPE,
80+
REFLECT_CLASS_LOADER,
8081

8182
REMOTE_VM_INSTRUCTION
8283
};

RemoteInput/Plugin/ControlCenter.cxx

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -652,6 +652,25 @@ void ControlCenter::process_command() noexcept
652652
}
653653
break;
654654

655+
case EIOSCommand::REFLECT_CLASS_LOADER:
656+
{
657+
jobject object = stream.read<jobject>();
658+
std::string result = main_reflector->GetClassType(object);
659+
660+
// auto cls = make_safe_local<jclass>(env, env->GetObjectClass(reflection->applet));
661+
// jmethodID mid = env->GetMethodID(cls.get(), "getClass", "()Ljava/lang/Class;");
662+
// auto clsObj = make_safe_local<jobject>(env, env->CallObjectMethod(reflection->applet, mid));
663+
// cls.reset(env->GetObjectClass(clsObj.get()));
664+
//
665+
// //Get Canvas's ClassLoader.
666+
// mid = env->GetMethodID(cls.get(), "getClassLoader", "()Ljava/lang/ClassLoader;");
667+
// reflection->classLoader = env->NewGlobalRef(make_safe_local<jobject>(env, env->CallObjectMethod(clsObj.get(), mid)).get());
668+
// reflection->cache = std::make_shared<JVMCache>(env, reflection->classLoader);
669+
670+
stream.write(result);
671+
}
672+
break;
673+
655674
case EIOSCommand::REMOTE_VM_INSTRUCTION:
656675
{
657676
this->remote_vm->process_command(&image_data);
@@ -1881,6 +1900,21 @@ std::string ControlCenter::reflect_class_type(const jobject object) const noexce
18811900
return std::string();
18821901
}
18831902

1903+
jobject ControlCenter::reflect_class_loader(const jobject object) const noexcept
1904+
{
1905+
bool result = send_command([&](Stream &stream, ImageData* image_data) {
1906+
image_data->set_command(EIOSCommand::REFLECT_CLASS_LOADER);
1907+
stream.write(object);
1908+
});
1909+
1910+
if (result)
1911+
{
1912+
Stream& stream = get_image_data()->data_stream();
1913+
return stream.read<jobject>();
1914+
}
1915+
return nullptr;
1916+
}
1917+
18841918
std::size_t ControlCenter::reflect_size_for_type(ReflectionType type) noexcept
18851919
{
18861920
static_assert(sizeof(jchar) == sizeof(char16_t) &&

RemoteInput/Plugin/ControlCenter.hxx

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -144,6 +144,7 @@ public:
144144

145145
std::string reflect_class_name(const jobject object) const noexcept;
146146
std::string reflect_class_type(const jobject object) const noexcept;
147+
jobject reflect_class_loader(const jobject object) const noexcept;
147148

148149
static std::size_t reflect_size_for_type(ReflectionType type) noexcept;
149150

RemoteInput/Plugin/JVM/JVMCache.cxx

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ JVMCache::JVMCache(JNIEnv* env, jobject class_loader) : class_loader(class_loade
1919

2020
JVMCache::~JVMCache()
2121
{
22-
class_cache.clear();
22+
clear();
2323
}
2424

2525
JVMCache::JVMCache(JVMCache&& other) : class_loader(other.class_loader), load_class_method(other.load_class_method), class_cache(std::move(other.class_cache)), field_cache(std::move(other.field_cache))
@@ -91,8 +91,12 @@ jfieldID JVMCache::GetFieldID(JNIEnv* env, jclass clazz, std::string_view name,
9191

9292
void JVMCache::clear()
9393
{
94-
class_cache.clear();
9594
field_cache.clear();
95+
96+
for (auto &pair : class_cache)
97+
{
98+
pair.second.release();
99+
}
96100
}
97101

98102
std::size_t JVMCache::field_hash(jclass clazz, std::string_view field_name, std::string_view signature) noexcept

RemoteInput/Plugin/JVM/RemoteVM.cxx

Lines changed: 20 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -565,7 +565,7 @@ jboolean RemoteVM::CallBooleanMethod(jobject obj, jmethodID methodID, const std:
565565
return env->CallBooleanMethodA(obj, methodID, args.data());
566566
}
567567

568-
jbyte RemoteVM::CallByteMethod(jobject obj, jmethodID methodID, const std::vector<jvalue> &args) const noexcept
568+
jbyte RemoteVM::CallByteMethod(jobject obj, jmethodID methodID, const std::vector<jvalue> &args) const noexcept
569569
{
570570
if (this->send_command)
571571
{
@@ -574,7 +574,7 @@ jbyte RemoteVM::CallByteMethod(jobject obj, jmethodID methodID, const std::vecto
574574
return env->CallByteMethodA(obj, methodID, args.data());
575575
}
576576

577-
jchar RemoteVM::CallCharMethod(jobject obj, jmethodID methodID, const std::vector<jvalue> &args) const noexcept
577+
jchar RemoteVM::CallCharMethod(jobject obj, jmethodID methodID, const std::vector<jvalue> &args) const noexcept
578578
{
579579
if (this->send_command)
580580
{
@@ -583,7 +583,7 @@ jchar RemoteVM::CallCharMethod(jobject obj, jmethodID methodID, const std::vecto
583583
return env->CallCharMethodA(obj, methodID, args.data());
584584
}
585585

586-
jshort RemoteVM::CallShortMethod(jobject obj, jmethodID methodID, const std::vector<jvalue> &args) const noexcept
586+
jshort RemoteVM::CallShortMethod(jobject obj, jmethodID methodID, const std::vector<jvalue> &args) const noexcept
587587
{
588588
if (this->send_command)
589589
{
@@ -592,7 +592,7 @@ jshort RemoteVM::CallShortMethod(jobject obj, jmethodID methodID, const std::vec
592592
return env->CallShortMethodA(obj, methodID, args.data());
593593
}
594594

595-
jint RemoteVM::CallIntMethod(jobject obj, jmethodID methodID, const std::vector<jvalue> &args) const noexcept
595+
jint RemoteVM::CallIntMethod(jobject obj, jmethodID methodID, const std::vector<jvalue> &args) const noexcept
596596
{
597597
if (this->send_command)
598598
{
@@ -601,7 +601,7 @@ jint RemoteVM::CallIntMethod(jobject obj, jmethodID methodID, const std::vector<
601601
return env->CallIntMethodA(obj, methodID, args.data());
602602
}
603603

604-
jlong RemoteVM::CallLongMethod(jobject obj, jmethodID methodID, const std::vector<jvalue> &args) const noexcept
604+
jlong RemoteVM::CallLongMethod(jobject obj, jmethodID methodID, const std::vector<jvalue> &args) const noexcept
605605
{
606606
if (this->send_command)
607607
{
@@ -610,7 +610,7 @@ jlong RemoteVM::CallLongMethod(jobject obj, jmethodID methodID, const std::vecto
610610
return env->CallLongMethodA(obj, methodID, args.data());
611611
}
612612

613-
jfloat RemoteVM::CallFloatMethod(jobject obj, jmethodID methodID, const std::vector<jvalue> &args) const noexcept
613+
jfloat RemoteVM::CallFloatMethod(jobject obj, jmethodID methodID, const std::vector<jvalue> &args) const noexcept
614614
{
615615
if (this->send_command)
616616
{
@@ -619,7 +619,7 @@ jfloat RemoteVM::CallFloatMethod(jobject obj, jmethodID methodID, const std::vec
619619
return env->CallFloatMethodA(obj, methodID, args.data());
620620
}
621621

622-
jdouble RemoteVM::CallDoubleMethod(jobject obj, jmethodID methodID, const std::vector<jvalue> &args) const noexcept
622+
jdouble RemoteVM::CallDoubleMethod(jobject obj, jmethodID methodID, const std::vector<jvalue> &args) const noexcept
623623
{
624624
if (this->send_command)
625625
{
@@ -628,7 +628,7 @@ jdouble RemoteVM::CallDoubleMethod(jobject obj, jmethodID methodID, const std::v
628628
return env->CallDoubleMethodA(obj, methodID, args.data());
629629
}
630630

631-
void RemoteVM::CallVoidMethod(jobject obj, jmethodID methodID, const std::vector<jvalue> &args) const noexcept
631+
void RemoteVM::CallVoidMethod(jobject obj, jmethodID methodID, const std::vector<jvalue> &args) const noexcept
632632
{
633633
if (this->send_command)
634634
{
@@ -637,7 +637,7 @@ void RemoteVM::CallVoidMethod(jobject obj, jmethodID methodID, const std::vector
637637
return env->CallVoidMethodA(obj, methodID, args.data());
638638
}
639639

640-
jobject RemoteVM::CallNonvirtualObjectMethod(jobject obj, jclass clazz, jmethodID methodID, const std::vector<jvalue> &args) const noexcept
640+
jobject RemoteVM::CallNonvirtualObjectMethod(jobject obj, jclass clazz, jmethodID methodID, const std::vector<jvalue> &args) const noexcept
641641
{
642642
if (this->send_command)
643643
{
@@ -646,7 +646,7 @@ jobject RemoteVM::CallNonvirtualObjectMethod(jobject obj, jclass clazz, jmethodI
646646
return local_to_global(env->CallNonvirtualObjectMethodA(obj, clazz, methodID, args.data()));
647647
}
648648

649-
jboolean RemoteVM::CallNonvirtualBooleanMethod(jobject obj, jclass clazz, jmethodID methodID, const std::vector<jvalue> &args) const noexcept
649+
jboolean RemoteVM::CallNonvirtualBooleanMethod(jobject obj, jclass clazz, jmethodID methodID, const std::vector<jvalue> &args) const noexcept
650650
{
651651
if (this->send_command)
652652
{
@@ -655,7 +655,7 @@ jboolean RemoteVM::CallNonvirtualBooleanMethod(jobject obj, jclass clazz, jmetho
655655
return env->CallNonvirtualBooleanMethodA(obj, clazz, methodID, args.data());
656656
}
657657

658-
jbyte RemoteVM::CallNonvirtualByteMethod(jobject obj, jclass clazz, jmethodID methodID, const std::vector<jvalue> &args) const noexcept
658+
jbyte RemoteVM::CallNonvirtualByteMethod(jobject obj, jclass clazz, jmethodID methodID, const std::vector<jvalue> &args) const noexcept
659659
{
660660
if (this->send_command)
661661
{
@@ -664,7 +664,7 @@ jbyte RemoteVM::CallNonvirtualByteMethod(jobject obj, jclass clazz, jmethodID me
664664
return env->CallNonvirtualByteMethodA(obj, clazz, methodID, args.data());
665665
}
666666

667-
jchar RemoteVM::CallNonvirtualCharMethod(jobject obj, jclass clazz, jmethodID methodID, const std::vector<jvalue> &args) const noexcept
667+
jchar RemoteVM::CallNonvirtualCharMethod(jobject obj, jclass clazz, jmethodID methodID, const std::vector<jvalue> &args) const noexcept
668668
{
669669
if (this->send_command)
670670
{
@@ -673,7 +673,7 @@ jchar RemoteVM::CallNonvirtualCharMethod(jobject obj, jclass clazz, jmethodID me
673673
return env->CallNonvirtualCharMethodA(obj, clazz, methodID, args.data());
674674
}
675675

676-
jshort RemoteVM::CallNonvirtualShortMethod(jobject obj, jclass clazz, jmethodID methodID, const std::vector<jvalue> &args) const noexcept
676+
jshort RemoteVM::CallNonvirtualShortMethod(jobject obj, jclass clazz, jmethodID methodID, const std::vector<jvalue> &args) const noexcept
677677
{
678678
if (this->send_command)
679679
{
@@ -682,7 +682,7 @@ jshort RemoteVM::CallNonvirtualShortMethod(jobject obj, jclass clazz, jmethodID
682682
return env->CallNonvirtualShortMethodA(obj, clazz, methodID, args.data());
683683
}
684684

685-
jint RemoteVM::CallNonvirtualIntMethod(jobject obj, jclass clazz, jmethodID methodID, const std::vector<jvalue> &args) const noexcept
685+
jint RemoteVM::CallNonvirtualIntMethod(jobject obj, jclass clazz, jmethodID methodID, const std::vector<jvalue> &args) const noexcept
686686
{
687687
if (this->send_command)
688688
{
@@ -691,7 +691,7 @@ jint RemoteVM::CallNonvirtualIntMethod(jobject obj, jclass clazz, jmethodID meth
691691
return env->CallNonvirtualIntMethodA(obj, clazz, methodID, args.data());
692692
}
693693

694-
jlong RemoteVM::CallNonvirtualLongMethod(jobject obj, jclass clazz, jmethodID methodID, const std::vector<jvalue> &args) const noexcept
694+
jlong RemoteVM::CallNonvirtualLongMethod(jobject obj, jclass clazz, jmethodID methodID, const std::vector<jvalue> &args) const noexcept
695695
{
696696
if (this->send_command)
697697
{
@@ -700,7 +700,7 @@ jlong RemoteVM::CallNonvirtualLongMethod(jobject obj, jclass clazz, jmethodID me
700700
return env->CallNonvirtualLongMethodA(obj, clazz, methodID, args.data());
701701
}
702702

703-
jfloat RemoteVM::CallNonvirtualFloatMethod(jobject obj, jclass clazz, jmethodID methodID, const std::vector<jvalue> &args) const noexcept
703+
jfloat RemoteVM::CallNonvirtualFloatMethod(jobject obj, jclass clazz, jmethodID methodID, const std::vector<jvalue> &args) const noexcept
704704
{
705705
if (this->send_command)
706706
{
@@ -709,7 +709,7 @@ jfloat RemoteVM::CallNonvirtualFloatMethod(jobject obj, jclass clazz, jmethodID
709709
return env->CallNonvirtualFloatMethodA(obj, clazz, methodID, args.data());
710710
}
711711

712-
jdouble RemoteVM::CallNonvirtualDoubleMethod(jobject obj, jclass clazz, jmethodID methodID, const std::vector<jvalue> &args) const noexcept
712+
jdouble RemoteVM::CallNonvirtualDoubleMethod(jobject obj, jclass clazz, jmethodID methodID, const std::vector<jvalue> &args) const noexcept
713713
{
714714
if (this->send_command)
715715
{
@@ -718,7 +718,7 @@ jdouble RemoteVM::CallNonvirtualDoubleMethod(jobject obj, jclass clazz, jmethodI
718718
return env->CallNonvirtualDoubleMethodA(obj, clazz, methodID, args.data());
719719
}
720720

721-
void RemoteVM::CallNonvirtualVoidMethod(jobject obj, jclass clazz, jmethodID methodID, const std::vector<jvalue> &args) const noexcept
721+
void RemoteVM::CallNonvirtualVoidMethod(jobject obj, jclass clazz, jmethodID methodID, const std::vector<jvalue> &args) const noexcept
722722
{
723723
if (this->send_command)
724724
{
@@ -745,7 +745,7 @@ jobject RemoteVM::GetObjectField(jobject obj, jfieldID fieldID) const noexcept
745745
return local_to_global(env->GetObjectField(obj, fieldID));
746746
}
747747

748-
jboolean RemoteVM::GetBooleanField(jobject obj, jfieldID fieldID) const noexcept
748+
jboolean RemoteVM::GetBooleanField(jobject obj, jfieldID fieldID) const noexcept
749749
{
750750
if (this->send_command)
751751
{
@@ -958,6 +958,7 @@ jint RemoteVM::CallStaticIntMethod(jclass clazz, jmethodID methodID, const std::
958958
{
959959
return SendCommand<jint>(RemoteVMCommand::CALL_STATIC_INT_METHOD, clazz, methodID, args);
960960
}
961+
961962
return env->CallStaticIntMethodA(clazz, methodID, args.data());
962963
}
963964

RemoteInput/Plugin/Plugin.cxx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -66,8 +66,8 @@ std::unique_ptr<Hook> exit_process;
6666
StartHook();
6767
}
6868

69-
exit_process = std::make_unique<Hook>((void *) GetProcAddress(GetModuleHandleA("kernel32.dll"), "ExitProcess"), (void *) __exit_process);
70-
exit_process->apply();
69+
//exit_process = std::make_unique<Hook>((void *) GetProcAddress(GetModuleHandleA("kernel32.dll"), "ExitProcess"), (void *) __exit_process);
70+
//exit_process->apply();
7171

7272
//Decrease our reference count by 1..
7373
//So if `FreeLibrary` was called previous, our count reaches 0 and we'll be freed.

0 commit comments

Comments
 (0)