1
Subject: nwfilter: fix an bug appearing on big endian machines
2
Origin: https://www.redhat.com/archives/libvir-list/2010-September/msg00297.html
3
Author: Stefan Berger <stefanb@linux.vnet.ibm.com>
7
Index: libvirt-0.8.3/src/conf/nwfilter_conf.c
8
===================================================================
9
--- libvirt-0.8.3.orig/src/conf/nwfilter_conf.c 2010-09-20 19:13:41.055669000 +0900
10
+++ libvirt-0.8.3/src/conf/nwfilter_conf.c 2010-09-20 19:13:43.695669002 +0900
23
-typedef bool (*valueValidator)(enum attrDatatype datatype, void *valptr,
24
+typedef bool (*valueValidator)(enum attrDatatype datatype, union data *valptr,
25
virNWFilterRuleDefPtr nwf);
26
typedef bool (*valueFormatter)(virBufferPtr buf,
27
virNWFilterRuleDefPtr nwf);
32
-checkMacProtocolID(enum attrDatatype datatype, void *value,
33
+checkMacProtocolID(enum attrDatatype datatype, union data *value,
34
virNWFilterRuleDefPtr nwf ATTRIBUTE_UNUSED)
38
if (datatype == DATATYPE_STRING) {
39
- if (intMapGetByString(macProtoMap, (char *)value, 1, &res) == 0)
40
+ if (intMapGetByString(macProtoMap, value->c, 1, &res) == 0)
42
datatype = DATATYPE_UINT16;
43
} else if (datatype == DATATYPE_UINT16 ||
44
datatype == DATATYPE_UINT16_HEX) {
45
- res = (uint32_t)*(uint16_t *)value;
53
checkMACMask(enum attrDatatype datatype ATTRIBUTE_UNUSED,
55
+ union data *macMask,
56
virNWFilterRuleDefPtr nwf ATTRIBUTE_UNUSED)
58
- return checkValidMask((unsigned char *)macMask, 6);
59
+ return checkValidMask(macMask->uc, 6);
66
arpOpcodeValidator(enum attrDatatype datatype,
69
virNWFilterRuleDefPtr nwf)
73
if (datatype == DATATYPE_STRING) {
74
- if (intMapGetByString(arpOpcodeMap, (char *)value, 1, &res) == 0)
75
+ if (intMapGetByString(arpOpcodeMap, value->c, 1, &res) == 0)
77
datatype = DATATYPE_UINT16;
78
} else if (datatype == DATATYPE_UINT16 ||
79
datatype == DATATYPE_UINT16_HEX) {
80
- res = (uint32_t)*(uint16_t *)value;
81
+ res = (uint32_t)value->ui;
88
static bool checkIPProtocolID(enum attrDatatype datatype,
91
virNWFilterRuleDefPtr nwf)
95
if (datatype == DATATYPE_STRING) {
96
- if (intMapGetByString(ipProtoMap, (char *)value, 1, &res) == 0)
97
+ if (intMapGetByString(ipProtoMap, value->c, 1, &res) == 0)
99
datatype = DATATYPE_UINT8_HEX;
100
} else if (datatype == DATATYPE_UINT8 ||
101
datatype == DATATYPE_UINT8_HEX) {
102
- res = (uint32_t)*(uint16_t *)value;
103
+ res = (uint32_t)value->ui;
107
@@ -615,10 +620,10 @@
111
-dscpValidator(enum attrDatatype datatype, void *val,
112
+dscpValidator(enum attrDatatype datatype, union data *val,
113
virNWFilterRuleDefPtr nwf)
115
- uint8_t dscp = *(uint16_t *)val;
116
+ uint8_t dscp = val->ui;
120
@@ -1150,7 +1155,8 @@
123
unsigned int uint_val;
124
- void *data_ptr = NULL, *storage_ptr;
127
valueValidator validator;
128
char *match = virXMLPropString(node, "match");
130
@@ -1206,7 +1212,7 @@
131
if (uint_val <= 0xff) {
132
*(uint8_t *)storage_ptr = uint_val;
134
- data_ptr = &uint_val;
135
+ data.ui = uint_val;
139
@@ -1221,7 +1227,7 @@
140
if (uint_val <= 0xffff) {
141
*(uint16_t *)storage_ptr = uint_val;
143
- data_ptr = &uint_val;
144
+ data.ui = uint_val;
148
@@ -1245,7 +1251,7 @@
149
*(uint8_t *)storage_ptr =
152
- data_ptr = &uint_val;
153
+ data.ui = uint_val;
157
@@ -1278,7 +1284,7 @@
158
(nwMACAddressPtr)storage_ptr)) {
161
- data_ptr = storage_ptr;
162
+ data.v = storage_ptr;
166
@@ -1299,7 +1305,7 @@
167
*(uint8_t *)storage_ptr =
170
- data_ptr = &uint_val;
171
+ data.ui = uint_val;
175
@@ -1322,7 +1328,7 @@
184
@@ -1344,7 +1350,7 @@
185
*flags = NWFILTER_ENTRY_ITEM_FLAG_EXISTS | flags_set;
186
item->datatype = datatype >> 1;
188
- if (!validator(datatype >> 1, data_ptr, nwf)) {
189
+ if (!validator(datatype >> 1, &data, nwf)) {