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:
commit
69eb60be5d
2 changed files with 68 additions and 29 deletions
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -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) {
|
||||
|
|
Loading…
Reference in a new issue