Do not send 0 byte string content.
Trying to send even 0 bytes to closed socket leads to broken pipe error. Sometimes property service is just quick enough and closes the socket between send(valuelen) and send(value) in the case where valuelen is 0. Bug: http://b/34670529 Test: adb reboot 20 times and make sure phone service did not fail Test: run bionic-unit-tests --gtest_filter=prop* Change-Id: I96f90ca6fe1790614e7efd3015bffed1ef1e9040
This commit is contained in:
parent
16b2a4de14
commit
cafd355375
2 changed files with 24 additions and 0 deletions
|
@ -575,6 +575,12 @@ class PropertyServiceConnection {
|
|||
return false;
|
||||
}
|
||||
|
||||
// Trying to send even 0 bytes to closed socket may lead to
|
||||
// broken pipe (http://b/34670529).
|
||||
if (valuelen == 0) {
|
||||
return true;
|
||||
}
|
||||
|
||||
int result = TEMP_FAILURE_RETRY(send(fd_, value, valuelen, 0));
|
||||
return CheckSendRecvResult(result, valuelen);
|
||||
}
|
||||
|
|
|
@ -126,3 +126,21 @@ TEST(properties, smoke) {
|
|||
#endif // __BIONIC__
|
||||
}
|
||||
|
||||
TEST(properties, empty_value) {
|
||||
#if defined(__BIONIC__)
|
||||
char propvalue[PROP_VALUE_MAX];
|
||||
|
||||
std::stringstream ss;
|
||||
ss << "debug.test." << getpid() << "." << NanoTime() << "." << "property_empty";
|
||||
const std::string property_name = ss.str();
|
||||
|
||||
for (size_t i=0; i<1000; ++i) {
|
||||
ASSERT_EQ(0, __system_property_set(property_name.c_str(), ""));
|
||||
ASSERT_EQ(0, __system_property_get(property_name.c_str(), propvalue));
|
||||
ASSERT_STREQ("", propvalue);
|
||||
}
|
||||
|
||||
#else // __BIONIC__
|
||||
GTEST_LOG_(INFO) << "This test does nothing.\n";
|
||||
#endif // __BIONIC__
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue