summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorOndrej Zajicek <santiago@crfreenet.org>2010-09-15 02:01:23 +0200
committerOndrej Zajicek <santiago@crfreenet.org>2010-09-15 02:01:23 +0200
commit2dec1e3471385ea191862c8fe85d76a8e47410de (patch)
treebc7b1122ca1806ac0368ea5139819a428117f05b
parenta58022a64ee8aa2fc46816020723dfbf4bfd08d9 (diff)
downloadbird-2dec1e3471385ea191862c8fe85d76a8e47410de.tar
bird-2dec1e3471385ea191862c8fe85d76a8e47410de.zip
Fixes a bug in pair sets.
-rw-r--r--filter/filter.c14
1 files changed, 11 insertions, 3 deletions
diff --git a/filter/filter.c b/filter/filter.c
index 971d230..81a4311 100644
--- a/filter/filter.c
+++ b/filter/filter.c
@@ -119,6 +119,13 @@ static inline int int_cmp(int i1, int i2)
else return 1;
}
+static inline int uint_cmp(unsigned int i1, unsigned int i2)
+{
+ if (i1 == i2) return 0;
+ if (i1 < i2) return -1;
+ else return 1;
+}
+
/**
* val_compare - compare two values
* @v1: first value
@@ -144,9 +151,9 @@ val_compare(struct f_val v1, struct f_val v2)
#ifndef IPV6
/* IP->Quad implicit conversion */
if ((v1.type == T_QUAD) && (v2.type == T_IP))
- return int_cmp(v1.val.i, ipa_to_u32(v2.val.px.ip));
+ return uint_cmp(v1.val.i, ipa_to_u32(v2.val.px.ip));
if ((v1.type == T_IP) && (v2.type == T_QUAD))
- return int_cmp(ipa_to_u32(v1.val.px.ip), v2.val.i);
+ return uint_cmp(ipa_to_u32(v1.val.px.ip), v2.val.i);
#endif
debug( "Types do not match in val_compare\n" );
@@ -156,9 +163,10 @@ val_compare(struct f_val v1, struct f_val v2)
case T_ENUM:
case T_INT:
case T_BOOL:
+ return int_cmp(v1.val.i, v2.val.i);
case T_PAIR:
case T_QUAD:
- return int_cmp(v1.val.i, v2.val.i);
+ return uint_cmp(v1.val.i, v2.val.i);
case T_IP:
return ipa_compare(v1.val.px.ip, v2.val.px.ip);
case T_PREFIX: