Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 07a1e232 authored by Dave Allison's avatar Dave Allison
Browse files

Move options buffers to top scope

It is important that the char buffers for options do
not go out of scope as the mOptions.add() does not copy
the buffer.  This moves all the buffers to the top
level scope of the function to prevent accidental
overwriting when they go out of scope.

Bug: 13448497
Change-Id: I5a97ddd32ff34f237915927906e1e1f833ff036e
parent 4cde7734
Loading
Loading
Loading
Loading
+29 −23
Original line number Diff line number Diff line
@@ -434,6 +434,14 @@ void AndroidRuntime::parseExtraOpts(char* extraOptsBuf, const char* quotingArg)
 * Various arguments, most determined by system properties, are passed in.
 * The "mOptions" vector is updated.
 *
 * CAUTION: when adding options in here, be careful not to put the
 * char buffer inside a nested scope.  Adding the buffer to the
 * options using mOptions.add() does not copy the buffer, so if the
 * buffer goes out of scope the option may be overwritten.  It's best
 * to put the buffer at the top of the function so that it is more
 * unlikely that someone will surround it in a scope at a later time
 * and thus introduce a bug.
 *
 * Returns 0 on success.
 */
int AndroidRuntime::startVm(JavaVM** pJavaVM, JNIEnv** pEnv)
@@ -468,7 +476,15 @@ int AndroidRuntime::startVm(JavaVM** pJavaVM, JNIEnv** pEnv)
      kEMIntFast,
      kEMJitCompiler,
    } executionMode = kEMDefault;

    char profile_period[sizeof("-Xprofile-period:") + PROPERTY_VALUE_MAX];
    char profile_duration[sizeof("-Xprofile-duration:") + PROPERTY_VALUE_MAX];
    char profile_interval[sizeof("-Xprofile-interval:") + PROPERTY_VALUE_MAX];
    char profile_backoff[sizeof("-Xprofile-backoff:") + PROPERTY_VALUE_MAX];
    char langOption[sizeof("-Duser.language=") + 3];
    char regionOption[sizeof("-Duser.region=") + 3];
    char lockProfThresholdBuf[sizeof("-Xlockprofthreshold:") + sizeof(propBuf)];
    char jitOpBuf[sizeof("-Xjitop:") + PROPERTY_VALUE_MAX];
    char jitMethodBuf[sizeof("-Xjitmethod:") + PROPERTY_VALUE_MAX];

    property_get("dalvik.vm.checkjni", propBuf, "");
    if (strcmp(propBuf, "true") == 0) {
@@ -669,7 +685,6 @@ int AndroidRuntime::startVm(JavaVM** pJavaVM, JNIEnv** pEnv)
        //mOptions.add(opt);
    }

    char lockProfThresholdBuf[sizeof("-Xlockprofthreshold:") + sizeof(propBuf)];
    property_get("dalvik.vm.lockprof.threshold", propBuf, "");
    if (strlen(propBuf) > 0) {
      strcpy(lockProfThresholdBuf, "-Xlockprofthreshold:");
@@ -679,7 +694,6 @@ int AndroidRuntime::startVm(JavaVM** pJavaVM, JNIEnv** pEnv)
    }

    /* Force interpreter-only mode for selected opcodes. Eg "1-0a,3c,f1-ff" */
    char jitOpBuf[sizeof("-Xjitop:") + PROPERTY_VALUE_MAX];
    property_get("dalvik.vm.jit.op", propBuf, "");
    if (strlen(propBuf) > 0) {
        strcpy(jitOpBuf, "-Xjitop:");
@@ -689,7 +703,6 @@ int AndroidRuntime::startVm(JavaVM** pJavaVM, JNIEnv** pEnv)
    }

    /* Force interpreter-only mode for selected methods */
    char jitMethodBuf[sizeof("-Xjitmethod:") + PROPERTY_VALUE_MAX];
    property_get("dalvik.vm.jit.method", propBuf, "");
    if (strlen(propBuf) > 0) {
        strcpy(jitMethodBuf, "-Xjitmethod:");
@@ -769,8 +782,6 @@ int AndroidRuntime::startVm(JavaVM** pJavaVM, JNIEnv** pEnv)

    /* Set the properties for locale */
    {
        char langOption[sizeof("-Duser.language=") + 3];
        char regionOption[sizeof("-Duser.region=") + 3];
        strcpy(langOption, "-Duser.language=");
        strcpy(regionOption, "-Duser.region=");
        readLocale(langOption, regionOption);
@@ -785,35 +796,30 @@ int AndroidRuntime::startVm(JavaVM** pJavaVM, JNIEnv** pEnv)
     * Set profiler options
     */
    if (libart) {
      char period[sizeof("-Xprofile-period:") + PROPERTY_VALUE_MAX];
      char duration[sizeof("-Xprofile-duration:") + PROPERTY_VALUE_MAX];
      char interval[sizeof("-Xprofile-interval:") + PROPERTY_VALUE_MAX];
      char backoff[sizeof("-Xprofile-backoff:") + PROPERTY_VALUE_MAX];

      // Number of seconds during profile runs.
      strcpy(period, "-Xprofile-period:");
      property_get("dalvik.vm.profile.period_secs", period+17, "10");
      opt.optionString = period;
      strcpy(profile_period, "-Xprofile-period:");
      property_get("dalvik.vm.profile.period_secs", profile_period+17, "10");
      opt.optionString = profile_period;
      mOptions.add(opt);

      // Length of each profile run (seconds).
      strcpy(duration, "-Xprofile-duration:");
      property_get("dalvik.vm.profile.duration_secs", duration+19, "30");
      opt.optionString = duration;
      strcpy(profile_duration, "-Xprofile-duration:");
      property_get("dalvik.vm.profile.duration_secs", profile_duration+19, "30");
      opt.optionString = profile_duration;
      mOptions.add(opt);


      // Polling interval during profile run (microseconds).
      strcpy(interval, "-Xprofile-interval:");
      property_get("dalvik.vm.profile.interval_us", interval+19, "10000");
      opt.optionString = interval;
      strcpy(profile_interval, "-Xprofile-interval:");
      property_get("dalvik.vm.profile.interval_us", profile_interval+19, "10000");
      opt.optionString = profile_interval;
      mOptions.add(opt);

      // Coefficient for period backoff.  The the period is multiplied
      // by this value after each profile run.
      strcpy(backoff, "-Xprofile-backoff:");
      property_get("dalvik.vm.profile.backoff_coeff", backoff+18, "2.0");
      opt.optionString = backoff;
      strcpy(profile_backoff, "-Xprofile-backoff:");
      property_get("dalvik.vm.profile.backoff_coeff", profile_backoff+18, "2.0");
      opt.optionString = profile_backoff;
      mOptions.add(opt);
    }