diff --git a/src/avian/machine.h b/src/avian/machine.h index ae8fe8e749..213e0bbe14 100644 --- a/src/avian/machine.h +++ b/src/avian/machine.h @@ -1263,7 +1263,7 @@ class Machine { Thread* exclusive; Thread* finalizeThread; Reference* jniReferences; - const char** properties; + char** properties; unsigned propertyCount; const char** arguments; unsigned argumentCount; diff --git a/src/jnienv.cpp b/src/jnienv.cpp index 420feaec12..725cbe354b 100644 --- a/src/jnienv.cpp +++ b/src/jnienv.cpp @@ -3944,10 +3944,10 @@ JNI_CreateJavaVM(Machine** m, Thread** t, void* args) } unsigned cpl = strlen(classpath); - RUNTIME_ARRAY(char, classpathProperty, cpl + sizeof(CLASSPATH_PROPERTY) + 1); + RUNTIME_ARRAY(char, classpathProperty, cpl + strlen(CLASSPATH_PROPERTY) + 2); if (addClasspathProperty) { char* p = RUNTIME_ARRAY_BODY(classpathProperty); - local::append(&p, CLASSPATH_PROPERTY, sizeof(CLASSPATH_PROPERTY), '='); + local::append(&p, CLASSPATH_PROPERTY, strlen(CLASSPATH_PROPERTY), '='); local::append(&p, classpath, cpl, 0); *(propertyPointer++) = RUNTIME_ARRAY_BODY(classpathProperty); } @@ -3962,6 +3962,8 @@ JNI_CreateJavaVM(Machine** m, Thread** t, void* args) (s, h, bf, af, p, c, properties, propertyCount, arguments, a->nOptions, stackLimit); + h->free(properties, sizeof(const char*) * propertyCount); + *t = p->makeThread(*m, 0, 0); enter(*t, Thread::ActiveState); diff --git a/src/machine.cpp b/src/machine.cpp index 74719cdbc2..29f1a8a270 100644 --- a/src/machine.cpp +++ b/src/machine.cpp @@ -3119,7 +3119,6 @@ Machine::Machine(System* system, Heap* heap, Finder* bootFinder, exclusive(0), finalizeThread(0), jniReferences(0), - properties(properties), propertyCount(propertyCount), arguments(arguments), argumentCount(argumentCount), @@ -3156,6 +3155,15 @@ Machine::Machine(System* system, Heap* heap, Finder* bootFinder, populateJNITables(&javaVMVTable, &jniEnvVTable); + // Copying the properties memory (to avoid memory crashes) + this->properties = (char**)heap->allocate(sizeof(char*) * propertyCount); + for (unsigned int i = 0; i < propertyCount; i++) + { + size_t length = strlen(properties[i]) + 1; // +1 for null-terminating char + this->properties[i] = (char*)heap->allocate(sizeof(char) * length); + memcpy(this->properties[i], properties[i], length); + } + const char* bootstrapProperty = findProperty(this, BOOTSTRAP_PROPERTY); const char* bootstrapPropertyDup = bootstrapProperty ? strdup(bootstrapProperty) : 0; const char* bootstrapPropertyEnd = bootstrapPropertyDup + (bootstrapPropertyDup ? strlen(bootstrapPropertyDup) : 0); @@ -3222,6 +3230,10 @@ Machine::dispose() heap->free(arguments, sizeof(const char*) * argumentCount); + for (unsigned int i = 0; i < propertyCount; i++) + { + heap->free(properties[i], sizeof(char) * (strlen(properties[i]) + 1)); + } heap->free(properties, sizeof(const char*) * propertyCount); static_cast(heapClient)->dispose();