summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPatrick McHardy <kaber@trash.net>2014-08-19 00:21:59 +0100
committerPatrick McHardy <kaber@trash.net>2014-08-19 00:21:59 +0100
commite2f4485e653c6c9aed7c98564ec3cfd233a49d59 (patch)
treef28d566c00e0430076c43ddc2f921f02e7ad4fbd
parent69ade79302b9bc7d88fa58db9d30555e54ef7887 (diff)
datatype: take endianess into account in symbolic_constant_print()
symbolic_constant_print() uses mpz_cmp_ui() to find the matching symbol. Since GMP internally treats all values as being in host byte, this doesn't work when the constant value is non-host byteorder, such as the ethernet protocol type. Export the expression's value in its original byteorder for comparison to fix this. Signed-off-by: Patrick McHardy <kaber@trash.net>
-rw-r--r--src/datatype.c8
1 files changed, 7 insertions, 1 deletions
diff --git a/src/datatype.c b/src/datatype.c
index 55af2278..36d59859 100644
--- a/src/datatype.c
+++ b/src/datatype.c
@@ -132,9 +132,15 @@ void symbolic_constant_print(const struct symbol_table *tbl,
const struct expr *expr)
{
const struct symbolic_constant *s;
+ uint64_t val = 0;
+
+ /* Export the data in the correct byteorder for comparison */
+ assert(expr->len / BITS_PER_BYTE <= sizeof(val));
+ mpz_export_data(&val, expr->value, expr->byteorder,
+ expr->len / BITS_PER_BYTE);
for (s = tbl->symbols; s->identifier != NULL; s++) {
- if (!mpz_cmp_ui(expr->value, s->value))
+ if (val == s->value)
break;
}