SystemProperties.set(): more exception message detail.

Bug: https://issuetracker.google.com/336223505
Change-Id: I5bbee1c036565d117e95941b8751f26494390be0
diff --git a/core/jni/android_os_SystemProperties.cpp b/core/jni/android_os_SystemProperties.cpp
index 7f3b32e..88e6fa3 100644
--- a/core/jni/android_os_SystemProperties.cpp
+++ b/core/jni/android_os_SystemProperties.cpp
@@ -190,15 +190,31 @@
             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);
+        }
     }
 }