aboutsummaryrefslogtreecommitdiffstats
path: root/testing/libyang/09e7159e4f91a39f3d19ba6590d558ab027a8a84.patch
blob: b6c54e51105beac602364f31b47abbf9f4997cb7 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
From 09e7159e4f91a39f3d19ba6590d558ab027a8a84 Mon Sep 17 00:00:00 2001
From: Michal Vasko <mvasko@cesnet.cz>
Date: Tue, 9 Apr 2019 12:19:54 +0200
Subject: [PATCH] lyb BUGFIX big endian platforms fixes

Refs #749
---
 src/parser_lyb.c  | 41 +++++++++++++++++++----------------------
 src/printer_lyb.c | 14 ++------------
 2 files changed, 21 insertions(+), 34 deletions(-)

diff --git a/src/parser_lyb.c b/src/parser_lyb.c
index 8baeabbf..3de1bb17 100644
--- a/src/parser_lyb.c
+++ b/src/parser_lyb.c
@@ -120,32 +120,29 @@ 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 num_size, size_t bytes, const char *data, struct lyb_state *lybs)
+lyb_read_number(void *num, size_t num_size, size_t bytes, const char *data, struct lyb_state *lybs)
 {
     int r, ret = 0;
-    size_t i;
-    uint8_t byte;
-
-    for (i = 0; i < bytes; ++i) {
-        ret += (r = lyb_read(data, &byte, 1, lybs));
-        LYB_HAVE_READ_RETURN(r, data, -1);
+    uint64_t buf = 0;
 
-        *(((uint8_t *)num) + i) = byte;
-    }
+    ret += (r = lyb_read(data, (uint8_t *)&buf, bytes, lybs));
+    LYB_HAVE_READ_RETURN(r, data, -1);
 
     /* correct byte order */
+    buf = le64toh(buf);
+
     switch (num_size) {
     case 1:
-        /* no need to do anything */
+        *((uint8_t *)num) = buf;
         break;
     case 2:
-        *num = le16toh(*num);
+        *((uint16_t *)num) = buf;
         break;
     case 4:
-        *num = le32toh(*num);
+        *((uint32_t *)num) = buf;
         break;
     case 8:
-        *num = le64toh(*num);
+        *((uint64_t *)num) = buf;
         break;
     default:
         LOGINT(lybs->ctx);
@@ -182,7 +179,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, sizeof len, 2, data, lybs));
+        ret += (r = lyb_read_number(&len, sizeof len, 2, data, lybs));
         LYB_HAVE_READ_GOTO(r, data, error);
     } else {
         /* read until the end of this subtree */
@@ -269,7 +266,7 @@ lyb_parse_model(const char *data, const struct lys_module **mod, struct lyb_stat
     LYB_HAVE_READ_GOTO(r, data, error);
 
     /* revision */
-    ret += (r = lyb_read(data, (uint8_t *)&rev, 2, lybs));
+    ret += (r = lyb_read_number(&rev, sizeof rev, 2, data, lybs));
     LYB_HAVE_READ_GOTO(r, data, error);
 
     if (rev) {
@@ -470,20 +467,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, sizeof value->uint8, 1, data, lybs);
+        ret = lyb_read_number(&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, sizeof value->uint16, 2, data, lybs);
+        ret = lyb_read_number(&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, sizeof value->uint32, 4, data, lybs);
+        ret = lyb_read_number(&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, sizeof value->uint64, 8, data, lybs);
+        ret = lyb_read_number(&value->uint64, sizeof value->uint64, 8, data, lybs);
         break;
     default:
         return -1;
@@ -1164,7 +1161,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, sizeof lybs->mod_count, 2, data, lybs));
+    ret += (r = lyb_read_number(&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);
@@ -1349,14 +1346,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, sizeof lybs.mod_count, 2, data, &lybs));
+    ret += (r = lyb_read_number(&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, sizeof len, 2, data, &lybs));
+        ret += (r = lyb_read_number(&len, sizeof len, 2, data, &lybs));
         LYB_HAVE_READ_GOTO(r, data, finish);
 
         /* model name */
diff --git a/src/printer_lyb.c b/src/printer_lyb.c
index 5a3deda5..928332af 100644
--- a/src/printer_lyb.c
+++ b/src/printer_lyb.c
@@ -480,20 +480,10 @@ lyb_write_start_subtree(struct lyout *out, struct lyb_state *lybs)
 static int
 lyb_write_number(uint64_t num, size_t bytes, struct lyout *out, struct lyb_state *lybs)
 {
-    int ret = 0;
-    size_t i;
-    uint8_t byte;
-
+    /* correct byte order */
     num = htole64(num);
-    for (i = 0; i < bytes; ++i) {
-        byte = *(((uint8_t *)&num) + i);
-        ret += lyb_write(out, &byte, 1, lybs);
-        if (ret < 0) {
-            break;
-        }
-    }
 
-    return ret;
+    return lyb_write(out, (uint8_t *)&num, bytes, lybs);
 }
 
 static int