NativeHelper: Avoid returning local stack string

Refactor JniInvocation::GetLibrary to not return a stack-allocated
string. Instead, provide a char buffer.

Bug: 16404669
Change-Id: I34f4a40e28bc491ba630a2b1bff5792e34937101
diff --git a/JniInvocation.cpp b/JniInvocation.cpp
index f4dd24e..30b1205 100644
--- a/JniInvocation.cpp
+++ b/JniInvocation.cpp
@@ -55,9 +55,11 @@
 #endif
 static const char* kLibraryFallback = "libart.so";
 
-const char* JniInvocation::GetLibrary(const char* library) {
+template<typename T> void UNUSED(const T&) {}
+
+const char* JniInvocation::GetLibrary(const char* library, char* buffer) {
 #ifdef HAVE_ANDROID_OS
-  char default_library[PROPERTY_VALUE_MAX];
+  const char* default_library;
 
   char debuggable[PROPERTY_VALUE_MAX];
   property_get(kDebuggableSystemProperty, debuggable, kDebuggableFallback);
@@ -65,17 +67,24 @@
   if (strcmp(debuggable, "1") != 0) {
     // Not a debuggable build.
     // Do not allow arbitrary library. Ignore the library parameter. This
-    // will also ignore the default library, but initialize to empty string
+    // will also ignore the default library, but initialize to fallback
     // for cleanliness.
     library = kLibraryFallback;
-    default_library[0] = 0;
+    default_library = kLibraryFallback;
   } else {
     // Debuggable build.
     // Accept the library parameter. For the case it is NULL, load the default
     // library from the system property.
-    property_get(kLibrarySystemProperty, default_library, kLibraryFallback);
+    if (buffer != NULL) {
+      property_get(kLibrarySystemProperty, buffer, kLibraryFallback);
+      default_library = buffer;
+    } else {
+      // No buffer given, just use default fallback.
+      default_library = kLibraryFallback;
+    }
   }
 #else
+  UNUSED(buffer);
   const char* default_library = kLibraryFallback;
 #endif
   if (library == NULL) {
@@ -86,7 +95,12 @@
 }
 
 bool JniInvocation::Init(const char* library) {
-  library = GetLibrary(library);
+#ifdef HAVE_ANDROID_OS
+  char buffer[PROPERTY_VALUE_MAX];
+#else
+  char* buffer = NULL;
+#endif
+  library = GetLibrary(library, buffer);
 
   handle_ = dlopen(library, RTLD_NOW);
   if (handle_ == NULL) {