diff options
Diffstat (limited to 'core/jni/android_os_SystemProperties.cpp')
-rw-r--r-- | core/jni/android_os_SystemProperties.cpp | 24 |
1 files changed, 20 insertions, 4 deletions
diff --git a/core/jni/android_os_SystemProperties.cpp b/core/jni/android_os_SystemProperties.cpp index 7f3b32e1abed..88e6fa3028ad 100644 --- a/core/jni/android_os_SystemProperties.cpp +++ b/core/jni/android_os_SystemProperties.cpp @@ -190,15 +190,31 @@ void SystemProperties_set(JNIEnv *env, jobject clazz, jstring keyJ, return; } } + // Calling SystemProperties.set() with a null value is equivalent to an + // empty string, but this is not true for the underlying libc function. + const char* value_c_str = value ? value->c_str() : ""; + // Explicitly clear errno so we can recognize __system_property_set() + // failures from failed system calls (as opposed to "init rejected your + // request" failures). + errno = 0; bool success; #if defined(__BIONIC__) - success = !__system_property_set(key.c_str(), value ? value->c_str() : ""); + success = !__system_property_set(key.c_str(), value_c_str); #else - success = android::base::SetProperty(key.c_str(), value ? value->c_str() : ""); + success = android::base::SetProperty(key.c_str(), value_c_str); #endif if (!success) { - jniThrowException(env, "java/lang/RuntimeException", - "failed to set system property (check logcat for reason)"); + if (errno != 0) { + jniThrowExceptionFmt(env, "java/lang/RuntimeException", + "failed to set system property \"%s\" to \"%s\": %m", + key.c_str(), value_c_str); + } else { + // Must have made init unhappy, which will have logged something, + // but there's no API to ask for more detail. + jniThrowExceptionFmt(env, "java/lang/RuntimeException", + "failed to set system property \"%s\" to \"%s\" (check logcat for reason)", + key.c_str(), value_c_str); + } } } |