diff options
author | Tuan Hoang <tmhoang@linux.ibm.com> | 2019-04-09 13:38:26 +0200 |
---|---|---|
committer | Andy Postnikov <apostnikov@gmail.com> | 2019-04-12 22:03:04 +0300 |
commit | 3267ee639c46ab2fa84f4844799352b75cfb9d1d (patch) | |
tree | 4a15446778cf0ba15035dcc83adfd800252c8093 /testing/libyang/5b3c324097fa3e122edb774213aeafd6eba137f9.patch | |
parent | f5c37421126bd55d85d5b2354b73b480c97ba9a8 (diff) | |
download | aports-3267ee639c46ab2fa84f4844799352b75cfb9d1d.tar.bz2 aports-3267ee639c46ab2fa84f4844799352b75cfb9d1d.tar.xz |
testing/libyang: fix byte order on s390x
Copy upstream commits
Diffstat (limited to 'testing/libyang/5b3c324097fa3e122edb774213aeafd6eba137f9.patch')
-rw-r--r-- | testing/libyang/5b3c324097fa3e122edb774213aeafd6eba137f9.patch | 136 |
1 files changed, 136 insertions, 0 deletions
diff --git a/testing/libyang/5b3c324097fa3e122edb774213aeafd6eba137f9.patch b/testing/libyang/5b3c324097fa3e122edb774213aeafd6eba137f9.patch new file mode 100644 index 0000000000..a589521c77 --- /dev/null +++ b/testing/libyang/5b3c324097fa3e122edb774213aeafd6eba137f9.patch @@ -0,0 +1,136 @@ +From 5b3c324097fa3e122edb774213aeafd6eba137f9 Mon Sep 17 00:00:00 2001 +From: Michal Vasko <mvasko@cesnet.cz> +Date: Mon, 8 Apr 2019 13:45:21 +0200 +Subject: [PATCH] lyb parser BUGFIX correct byte order for all numbers + +Fixes #747 +--- + src/parser_lyb.c | 50 ++++++++++++++++++++++++++++++------------------ + 1 file changed, 31 insertions(+), 19 deletions(-) + +diff --git a/src/parser_lyb.c b/src/parser_lyb.c +index 628fba91..8baeabbf 100644 +--- a/src/parser_lyb.c ++++ b/src/parser_lyb.c +@@ -120,7 +120,7 @@ lyb_read(const char *data, uint8_t *buf, size_t count, struct lyb_state *lybs) + } + + static int +-lyb_read_number(uint64_t *num, size_t bytes, const char *data, struct lyb_state *lybs) ++lyb_read_number(uint64_t *num, size_t num_size, size_t bytes, const char *data, struct lyb_state *lybs) + { + int r, ret = 0; + size_t i; +@@ -133,15 +133,32 @@ lyb_read_number(uint64_t *num, size_t bytes, const char *data, struct lyb_state + *(((uint8_t *)num) + i) = byte; + } + ++ /* correct byte order */ ++ switch (num_size) { ++ case 1: ++ /* no need to do anything */ ++ break; ++ case 2: ++ *num = le16toh(*num); ++ break; ++ case 4: ++ *num = le32toh(*num); ++ break; ++ case 8: ++ *num = le64toh(*num); ++ break; ++ default: ++ LOGINT(lybs->ctx); ++ return -1; ++ } ++ + return ret; + } + + static int + lyb_read_enum(uint64_t *enum_idx, uint32_t count, const char *data, struct lyb_state *lybs) + { +- int ret = 0; + size_t bytes; +- uint64_t tmp_enum = 0; + + if (count < (1 << 8)) { + bytes = 1; +@@ -153,11 +170,9 @@ lyb_read_enum(uint64_t *enum_idx, uint32_t count, const char *data, struct lyb_s + bytes = 4; + } + +- /* The enum is always read into a uint64_t buffer */ +- ret = lyb_read_number(&tmp_enum, bytes, data, lybs); +- *enum_idx = le64toh(tmp_enum); +- +- return ret; ++ /* enum is always read into a uint64_t buffer */ ++ *enum_idx = 0; ++ return lyb_read_number(enum_idx, sizeof *enum_idx, bytes, data, lybs); + } + + static int +@@ -167,7 +182,7 @@ lyb_read_string(const char *data, char **str, int with_length, struct lyb_state + size_t len = 0, cur_len; + + if (with_length) { +- ret += (r = lyb_read_number((uint64_t *)&len, 2, data, lybs)); ++ ret += (r = lyb_read_number((uint64_t *)&len, sizeof len, 2, data, lybs)); + LYB_HAVE_READ_GOTO(r, data, error); + } else { + /* read until the end of this subtree */ +@@ -455,23 +470,20 @@ lyb_parse_val_1(struct lys_type *type, LY_DATA_TYPE value_type, uint8_t value_fl + break; + case LY_TYPE_INT8: + case LY_TYPE_UINT8: +- ret = lyb_read_number((uint64_t *)&value->uint8, 1, data, lybs); ++ ret = lyb_read_number((uint64_t *)&value->uint8, sizeof value->uint8, 1, data, lybs); + break; + case LY_TYPE_INT16: + case LY_TYPE_UINT16: +- ret = lyb_read_number((uint64_t *)&value->uint16, 2, data, lybs); +- value->uint16 = le16toh(value->uint16); ++ ret = lyb_read_number((uint64_t *)&value->uint16, sizeof value->uint16, 2, data, lybs); + break; + case LY_TYPE_INT32: + case LY_TYPE_UINT32: +- ret = lyb_read_number((uint64_t *)&value->uint32, 4, data, lybs); +- value->uint32 = le32toh(value->uint32); ++ ret = lyb_read_number((uint64_t *)&value->uint32, sizeof value->uint32, 4, data, lybs); + break; + case LY_TYPE_DEC64: + case LY_TYPE_INT64: + case LY_TYPE_UINT64: +- ret = lyb_read_number((uint64_t *)&value->uint64, 8, data, lybs); +- value->uint64 = le64toh(value->uint64); ++ ret = lyb_read_number((uint64_t *)&value->uint64, sizeof value->uint64, 8, data, lybs); + break; + default: + return -1; +@@ -1152,7 +1164,7 @@ lyb_parse_data_models(const char *data, struct lyb_state *lybs) + int i, r, ret = 0; + + /* read model count */ +- ret += (r = lyb_read_number((uint64_t *)&lybs->mod_count, 2, data, lybs)); ++ ret += (r = lyb_read_number((uint64_t *)&lybs->mod_count, sizeof lybs->mod_count, 2, data, lybs)); + LYB_HAVE_READ_RETURN(r, data, -1); + + lybs->models = malloc(lybs->mod_count * sizeof *lybs->models); +@@ -1337,14 +1349,14 @@ lyd_lyb_data_length(const char *data) + LYB_HAVE_READ_GOTO(r, data, finish); + + /* read model count */ +- ret += (r = lyb_read_number((uint64_t *)&lybs.mod_count, 2, data, &lybs)); ++ ret += (r = lyb_read_number((uint64_t *)&lybs.mod_count, sizeof lybs.mod_count, 2, data, &lybs)); + LYB_HAVE_READ_GOTO(r, data, finish); + + /* read all models */ + for (i = 0; i < lybs.mod_count; ++i) { + /* module name length */ + len = 0; +- ret += (r = lyb_read_number((uint64_t *)&len, 2, data, &lybs)); ++ ret += (r = lyb_read_number((uint64_t *)&len, sizeof len, 2, data, &lybs)); + LYB_HAVE_READ_GOTO(r, data, finish); + + /* model name */ |