From 6e3b1703937f8e28df4f69785f1e2d335c0e68d8 Mon Sep 17 00:00:00 2001 From: Ilya Mizus Date: Wed, 9 Apr 2014 10:16:53 +0400 Subject: [PATCH] Trying to solve the properties memory problem --- src/avian/machine.h | 2 +- src/jnienv.cpp | 4 ++-- src/machine.cpp | 13 ++++++++++++- 3 files changed, 15 insertions(+), 4 deletions(-) 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 6872d775f1..0debe43d1f 100644 --- a/src/jnienv.cpp +++ b/src/jnienv.cpp @@ -3940,10 +3940,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); } diff --git a/src/machine.cpp b/src/machine.cpp index 74719cdbc2..f93dc083ab 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), @@ -3164,6 +3163,14 @@ Machine::Machine(System* system, Heap* heap, Finder* bootFinder, if (codeLibraryName && (codeLibraryNameEnd = strchr(codeLibraryName, system->pathSeparator()))) *codeLibraryNameEnd = 0; + // Copying the properties memory (to avoid memory crashes) + this->properties = (char**)heap->allocate(sizeof(char*) * propertyCount); + for (unsigned int i = 0; i < propertyCount; i++) + { + this->properties[i] = (char*)heap->allocate(sizeof(char) * (strlen(properties[i]) + 1)); + strcpy(this->properties[i], properties[i]); + } + if (not system->success(system->make(&localThread)) or not system->success(system->make(&stateLock)) or not system->success(system->make(&heapLock)) or @@ -3222,6 +3229,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();