summaryrefslogtreecommitdiffhomepage
path: root/vallist.c
diff options
context:
space:
mode:
authorJo-Philipp Wich <jo@mein.io>2022-02-11 17:53:53 +0100
committerJo-Philipp Wich <jo@mein.io>2022-02-11 18:00:45 +0100
commit116a8ce35fd50e586d1c79d6f99237428adfa2ef (patch)
tree083a191c4171711231ef24c2b5c2316f32917af9 /vallist.c
parenta317c17f5ddfc3f749d349de01eeea5cad3eb162 (diff)
vallist: fix storing/retrieving short strings with 8bit byte values
Due to using signed byte values when writing/reading short strings to/from pointer addresses, 8 bit characters where incorrectly clamped to `-1` (`255`). Fix this issue by treating the input string as `uint8_t` array. Signed-off-by: Jo-Philipp Wich <jo@mein.io>
Diffstat (limited to 'vallist.c')
-rw-r--r--vallist.c10
1 files changed, 6 insertions, 4 deletions
diff --git a/vallist.c b/vallist.c
index 2cea983..b42f564 100644
--- a/vallist.c
+++ b/vallist.c
@@ -380,6 +380,7 @@ find_dbl(uc_value_list_t *list, double d)
static void
add_str(uc_value_list_t *list, const char *s, size_t slen)
{
+ const uint8_t *u8 = (const uint8_t *)s;
uint32_t sl;
size_t sz;
char *dst;
@@ -401,7 +402,7 @@ add_str(uc_value_list_t *list, const char *s, size_t slen)
list->index[list->isize] = (uint64_t)(TAG_STR | TAG_SET_STR_L(slen));
for (i = 0; i < slen; i++)
- list->index[list->isize] |= (((TAG_TYPE)s[i] << ((i + 1) << 3)));
+ list->index[list->isize] |= (((TAG_TYPE)u8[i] << ((i + 1) << 3)));
list->isize++;
}
@@ -426,6 +427,7 @@ add_str(uc_value_list_t *list, const char *s, size_t slen)
static ssize_t
find_str(uc_value_list_t *list, const char *s, size_t slen)
{
+ const uint8_t *u8 = (const uint8_t *)s;
TAG_TYPE search;
size_t i, len;
@@ -433,7 +435,7 @@ find_str(uc_value_list_t *list, const char *s, size_t slen)
search = (TAG_TYPE)(TAG_STR | TAG_SET_STR_L(slen));
for (i = 0; i < slen; i++)
- search |= (((TAG_TYPE)s[i] << ((i + 1) << 3)));
+ search |= (((TAG_TYPE)u8[i] << ((i + 1) << 3)));
for (i = 0; i < list->isize; i++)
if (list->index[i] == search)
@@ -534,7 +536,7 @@ uc_vallist_type(uc_value_list_t *list, size_t idx)
uc_value_t *
uc_vallist_get(uc_value_list_t *list, size_t idx)
{
- char str[sizeof(TAG_TYPE)];
+ uint8_t str[sizeof(TAG_TYPE)];
size_t n, len;
switch (uc_vallist_type(list, idx)) {
@@ -559,7 +561,7 @@ uc_vallist_get(uc_value_list_t *list, size_t idx)
for (n = 0; n < len; n++)
str[n] = (list->index[idx] >> ((n + 1) << 3));
- return ucv_string_new_length(str, len);
+ return ucv_string_new_length((char *)str, len);
case TAG_LSTR:
if (TAG_GET_OFFSET(list->index[idx]) + sizeof(uint32_t) > list->dsize)