From: Andreas Reichel <
andreas.r...@siemens.com>
If bgenv_get is called with a NULL pointer as data destination, it
returns the size of the buffer that must be provided by the user.
However, if the function fails, it also returns an error code greater
than zero, that overlaps possible values for the buffer size, so that
the user cannot distinguish failed and successful states.
To solve this, error codes are mapped to their negative counterparts,
i.e. bgenv_get returns -errno instead of errno.
To be symmetric to bgenv_set, the same is changed there.
Signed-off-by: Andreas Reichel <
andreas.r...@siemens.com>
---
env/env_api_fat.c | 24 ++++++++++++------------
env/uservars.c | 4 ++--
tools/tests/test_api.c | 8 ++++----
3 files changed, 18 insertions(+), 18 deletions(-)
diff --git a/env/env_api_fat.c b/env/env_api_fat.c
index 0635024..851b70c 100644
--- a/env/env_api_fat.c
+++ b/env/env_api_fat.c
@@ -454,11 +454,11 @@ int bgenv_get(BGENV *env, char *key, char *type, void *data, uint32_t maxlen)
char buffer[ENV_STRING_LENGTH];
if (!key || maxlen == 0) {
- return EINVAL;
+ return -EINVAL;
}
e = bgenv_str2enum(key);
if (!env) {
- return EPERM;
+ return -EPERM;
}
if (e == EBGENV_UNKNOWN) {
if (!data) {
@@ -526,7 +526,7 @@ int bgenv_get(BGENV *env, char *key, char *type, void *data, uint32_t maxlen)
if (!data) {
return 0;
}
- return EINVAL;
+ return -EINVAL;
}
return 0;
}
@@ -539,12 +539,12 @@ int bgenv_set(BGENV *env, char *key, char *type, void *data, uint32_t datalen)
char *value = (char *)data;
if (!key || !data || datalen == 0) {
- return EINVAL;
+ return -EINVAL;
}
e = bgenv_str2enum(key);
if (!env) {
- return EPERM;
+ return -EPERM;
}
if (e == EBGENV_UNKNOWN) {
return bgenv_set_uservar(env->data->userdata, key, type, data,
@@ -555,10 +555,10 @@ int bgenv_set(BGENV *env, char *key, char *type, void *data, uint32_t datalen)
val = strtol(value, &p, 10);
if ((errno == ERANGE && (val == LONG_MAX || val == LONG_MIN)) ||
(errno != 0 && val == 0)) {
- return errno;
+ return -errno;
}
if (p == value) {
- return EINVAL;
+ return -EINVAL;
}
env->data->revision = val;
break;
@@ -572,10 +572,10 @@ int bgenv_set(BGENV *env, char *key, char *type, void *data, uint32_t datalen)
val = strtol(value, &p, 10);
if ((errno == ERANGE && (val == LONG_MAX || val == LONG_MIN)) ||
(errno != 0 && val == 0)) {
- return errno;
+ return -errno;
}
if (p == value) {
- return EINVAL;
+ return -EINVAL;
}
env->data->watchdog_timeout_sec = val;
break;
@@ -583,15 +583,15 @@ int bgenv_set(BGENV *env, char *key, char *type, void *data, uint32_t datalen)
val = strtol(value, &p, 10);
if ((errno == ERANGE && (val == LONG_MAX || val == LONG_MIN)) ||
(errno != 0 && val == 0)) {
- return errno;
+ return -errno;
}
if (p == value) {
- return EINVAL;
+ return -EINVAL;
}
env->data->ustate = val;
break;
default:
- return EINVAL;
+ return -EINVAL;
}
return 0;
}
diff --git a/env/uservars.c b/env/uservars.c
index abbcf54..cd3f24b 100644
--- a/env/uservars.c
+++ b/env/uservars.c
@@ -96,7 +96,7 @@ int bgenv_get_uservar(uint8_t *udata, char *key, char *type, void *data,
uservar = bgenv_find_uservar(udata, key);
if (!uservar) {
- return EINVAL;
+ return -EINVAL;
}
bgenv_map_uservar(uservar, &lkey, <ype, &value, NULL, &dsize);
@@ -136,7 +136,7 @@ int bgenv_set_uservar(uint8_t *udata, char *key, char *type, void *data,
p = bgenv_uservar_alloc(udata, total_size);
}
if (!p) {
- return errno;
+ return -errno;
}
bgenv_serialize_uservar(p, key, type, data, total_size);
diff --git a/tools/tests/test_api.c b/tools/tests/test_api.c
index fc5267d..d6b12e2 100644
--- a/tools/tests/test_api.c
+++ b/tools/tests/test_api.c
@@ -104,7 +104,7 @@ static void test_api_accesscurrent(void **state)
assert_int_equal(ret, 0);
ret = ebg_env_set(&e, "kernelfile", "vmlinuz");
- assert_int_equal(ret, EPERM);
+ assert_int_equal(ret, -EPERM);
will_return(bgenv_open_latest, &env);
ret = ebg_env_open_current(&e);
@@ -112,7 +112,7 @@ static void test_api_accesscurrent(void **state)
assert_int_equal(ebg_env_set(&e, "kernelfile", "vmlinuz"), 0);
assert_int_equal(ebg_env_set(&e, "kernelparams", "root=/dev/sda"), 0);
- assert_int_equal(ebg_env_set(&e, "watchdog_timeout_sec", "abc"), EINVAL);
+ assert_int_equal(ebg_env_set(&e, "watchdog_timeout_sec", "abc"), -EINVAL);
assert_int_equal(ebg_env_set(&e, "watchdog_timeout_sec", "0013"), 0);
assert_int_equal(ebg_env_set(&e, "ustate", "1"), 0);
@@ -121,7 +121,7 @@ static void test_api_accesscurrent(void **state)
assert_int_equal(ret, 0);
ret = ebg_env_get(&e, "kernelfile", buffer);
- assert_int_equal(ret, EPERM);
+ assert_int_equal(ret, -EPERM);
will_return(bgenv_open_latest, &env);
ret = ebg_env_open_current(&e);
@@ -282,7 +282,7 @@ static void test_api_uservars(void **state)
ret = ebg_env_set_ex(&e, "A", "B", dummymem, space_left);
free(dummymem);
- assert_int_equal(ret, ENOMEM);
+ assert_int_equal(ret, -ENOMEM);
// test user data type
ret = ebg_env_set_ex(&e, "A", "B", "C", 2);
--
2.14.2