Merge changes Idafeb835,Ie1a9bf85

* changes:
  libcutils: Use strnlen for default property values
  Use clang-format to fix up properties.c
This commit is contained in:
Treehugger Robot 2016-12-22 18:52:18 +00:00 committed by Gerrit Code Review
commit 69eb60be5d
2 changed files with 68 additions and 29 deletions

View file

@ -36,7 +36,7 @@ int8_t property_get_bool(const char *key, int8_t default_value) {
}
int8_t result = default_value;
char buf[PROPERTY_VALUE_MAX] = {'\0',};
char buf[PROPERTY_VALUE_MAX] = {'\0'};
int len = property_get(key, buf, "");
if (len == 1) {
@ -47,7 +47,7 @@ int8_t property_get_bool(const char *key, int8_t default_value) {
result = true;
}
} else if (len > 1) {
if (!strcmp(buf, "no") || !strcmp(buf, "false") || !strcmp(buf, "off")) {
if (!strcmp(buf, "no") || !strcmp(buf, "false") || !strcmp(buf, "off")) {
result = false;
} else if (!strcmp(buf, "yes") || !strcmp(buf, "true") || !strcmp(buf, "on")) {
result = true;
@ -59,13 +59,13 @@ int8_t property_get_bool(const char *key, int8_t default_value) {
// Convert string property to int (default if fails); return default value if out of bounds
static intmax_t property_get_imax(const char *key, intmax_t lower_bound, intmax_t upper_bound,
intmax_t default_value) {
intmax_t default_value) {
if (!key) {
return default_value;
}
intmax_t result = default_value;
char buf[PROPERTY_VALUE_MAX] = {'\0',};
char buf[PROPERTY_VALUE_MAX] = {'\0'};
char *end = NULL;
int len = property_get(key, buf, "");
@ -74,7 +74,7 @@ static intmax_t property_get_imax(const char *key, intmax_t lower_bound, intmax_
errno = 0;
// Infer base automatically
result = strtoimax(buf, &end, /*base*/0);
result = strtoimax(buf, &end, /*base*/ 0);
if ((result == INTMAX_MIN || result == INTMAX_MAX) && errno == ERANGE) {
// Over or underflow
result = default_value;
@ -86,8 +86,8 @@ static intmax_t property_get_imax(const char *key, intmax_t lower_bound, intmax_
} else if (end == buf) {
// Numeric conversion failed
result = default_value;
ALOGV("%s(%s,%" PRIdMAX ") - numeric conversion failed",
__FUNCTION__, key, default_value);
ALOGV("%s(%s,%" PRIdMAX ") - numeric conversion failed", __FUNCTION__, key,
default_value);
}
errno = tmp;
@ -107,38 +107,31 @@ int32_t property_get_int32(const char *key, int32_t default_value) {
#define _REALLY_INCLUDE_SYS__SYSTEM_PROPERTIES_H_
#include <sys/_system_properties.h>
int property_set(const char *key, const char *value)
{
int property_set(const char *key, const char *value) {
return __system_property_set(key, value);
}
int property_get(const char *key, char *value, const char *default_value)
{
int property_get(const char *key, char *value, const char *default_value) {
int len;
len = __system_property_get(key, value);
if(len > 0) {
if (len > 0) {
return len;
}
if(default_value) {
len = strlen(default_value);
if (len >= PROPERTY_VALUE_MAX) {
len = PROPERTY_VALUE_MAX - 1;
}
if (default_value) {
len = strnlen(default_value, PROPERTY_VALUE_MAX - 1);
memcpy(value, default_value, len);
value[len] = '\0';
}
return len;
}
struct property_list_callback_data
{
struct property_list_callback_data {
void (*propfn)(const char *key, const char *value, void *cookie);
void *cookie;
};
static void property_list_callback(const prop_info *pi, void *cookie)
{
static void property_list_callback(const prop_info *pi, void *cookie) {
char name[PROP_NAME_MAX];
char value[PROP_VALUE_MAX];
struct property_list_callback_data *data = cookie;
@ -147,10 +140,7 @@ static void property_list_callback(const prop_info *pi, void *cookie)
data->propfn(name, value, data->cookie);
}
int property_list(
void (*propfn)(const char *key, const char *value, void *cookie),
void *cookie)
{
struct property_list_callback_data data = { propfn, cookie };
int property_list(void (*propfn)(const char *key, const char *value, void *cookie), void *cookie) {
struct property_list_callback_data data = {propfn, cookie};
return __system_property_foreach(property_list_callback, &data);
}

View file

@ -159,19 +159,68 @@ TEST_F(PropertiesTest, SetString) {
TEST_F(PropertiesTest, GetString) {
// Try to use a default value that's too long => set fails
// Try to use a default value that's too long => get truncates the value
{
ASSERT_OK(property_set(PROPERTY_TEST_KEY, ""));
std::string maxLengthString = std::string(PROPERTY_VALUE_MAX-1, 'a');
std::string maxLengthString = std::string(PROPERTY_VALUE_MAX - 1, 'a');
std::string oneLongerString = std::string(PROPERTY_VALUE_MAX, 'a');
// Expect that the value is truncated since it's too long (by 1)
int len = property_get(PROPERTY_TEST_KEY, mValue, oneLongerString.c_str());
EXPECT_EQ(PROPERTY_VALUE_MAX-1, len);
EXPECT_EQ(PROPERTY_VALUE_MAX - 1, len);
EXPECT_STREQ(maxLengthString.c_str(), mValue);
ResetValue();
}
// Try to use a default value that's the max length => get succeeds
{
ASSERT_OK(property_set(PROPERTY_TEST_KEY, ""));
std::string maxLengthString = std::string(PROPERTY_VALUE_MAX - 1, 'b');
// Expect that the value matches maxLengthString
int len = property_get(PROPERTY_TEST_KEY, mValue, maxLengthString.c_str());
EXPECT_EQ(PROPERTY_VALUE_MAX - 1, len);
EXPECT_STREQ(maxLengthString.c_str(), mValue);
ResetValue();
}
// Try to use a default value of length one => get succeeds
{
ASSERT_OK(property_set(PROPERTY_TEST_KEY, ""));
std::string oneCharString = std::string(1, 'c');
// Expect that the value matches oneCharString
int len = property_get(PROPERTY_TEST_KEY, mValue, oneCharString.c_str());
EXPECT_EQ(1, len);
EXPECT_STREQ(oneCharString.c_str(), mValue);
ResetValue();
}
// Try to use a default value of length zero => get succeeds
{
ASSERT_OK(property_set(PROPERTY_TEST_KEY, ""));
std::string zeroCharString = std::string(0, 'd');
// Expect that the value matches oneCharString
int len = property_get(PROPERTY_TEST_KEY, mValue, zeroCharString.c_str());
EXPECT_EQ(0, len);
EXPECT_STREQ(zeroCharString.c_str(), mValue);
ResetValue();
}
// Try to use a NULL default value => get returns 0
{
ASSERT_OK(property_set(PROPERTY_TEST_KEY, ""));
// Expect a return value of 0
int len = property_get(PROPERTY_TEST_KEY, mValue, NULL);
EXPECT_EQ(0, len);
ResetValue();
}
}
TEST_F(PropertiesTest, GetBool) {