summaryrefslogtreecommitdiff
path: root/debian/patches/02_chunk-endianness.patch
diff options
context:
space:
mode:
Diffstat (limited to 'debian/patches/02_chunk-endianness.patch')
-rw-r--r--debian/patches/02_chunk-endianness.patch72
1 files changed, 72 insertions, 0 deletions
diff --git a/debian/patches/02_chunk-endianness.patch b/debian/patches/02_chunk-endianness.patch
new file mode 100644
index 000000000..f98dfee11
--- /dev/null
+++ b/debian/patches/02_chunk-endianness.patch
@@ -0,0 +1,72 @@
+commit 701d6ed7361c4554411f06079816784bc43d6df4
+Author: Tobias Brunner <tobias@strongswan.org>
+Date: Wed Oct 22 19:41:40 2014 +0200
+
+ chunk: Fix internet checksum calculation on big-endian systems
+
+ ntohs() might be defined as noop (#define ntohs(x) (x)) so we have
+ to manually shorten the negated value (gets promoted to an int).
+
+diff --git a/src/libstrongswan/utils/chunk.c b/src/libstrongswan/utils/chunk.c
+index 4b24b37..c4471be 100644
+--- a/src/libstrongswan/utils/chunk.c
++++ b/src/libstrongswan/utils/chunk.c
+@@ -992,7 +992,7 @@ u_int32_t chunk_hash_static(chunk_t chunk)
+ */
+ u_int16_t chunk_internet_checksum_inc(chunk_t data, u_int16_t checksum)
+ {
+- u_int32_t sum = ntohs(~checksum);
++ u_int32_t sum = ntohs((u_int16_t)~checksum);
+
+ while (data.len > 1)
+ {
+
+commit 1c70c6ed275c7701877dbf6322721af38ada2d68
+Author: Tobias Brunner <tobias@strongswan.org>
+Date: Wed Oct 22 19:43:22 2014 +0200
+
+ unit-tests: Fix internet checksum tests on big-endian systems
+
+ We actually need to do a byte-swap, which ntohs() only does on
+ little-endian systems.
+
+diff --git a/src/libstrongswan/tests/suites/test_chunk.c b/src/libstrongswan/tests/suites/test_chunk.c
+index d71e010..b5d2365 100644
+--- a/src/libstrongswan/tests/suites/test_chunk.c
++++ b/src/libstrongswan/tests/suites/test_chunk.c
+@@ -787,6 +787,11 @@ END_TEST
+ * test for chunk_internet_checksum[_inc]()
+ */
+
++static inline u_int16_t compensate_alignment(u_int16_t val)
++{
++ return ((val & 0xff) << 8) | (val >> 8);
++}
++
+ START_TEST(test_chunk_internet_checksum)
+ {
+ chunk_t chunk;
+@@ -804,9 +809,9 @@ START_TEST(test_chunk_internet_checksum)
+
+ /* need to compensate for even/odd alignment */
+ sum = chunk_internet_checksum(chunk_create(chunk.ptr, 9));
+- sum = ntohs(sum);
++ sum = compensate_alignment(sum);
+ sum = chunk_internet_checksum_inc(chunk_create(chunk.ptr+9, 11), sum);
+- sum = ntohs(sum);
++ sum = compensate_alignment(sum);
+ ck_assert_int_eq(0x442e, ntohs(sum));
+
+ chunk = chunk_from_chars(0x45,0x00,0x00,0x30,0x44,0x22,0x40,0x00,0x80,0x06,
+@@ -821,9 +826,9 @@ START_TEST(test_chunk_internet_checksum)
+
+ /* need to compensate for even/odd alignment */
+ sum = chunk_internet_checksum(chunk_create(chunk.ptr, 9));
+- sum = ntohs(sum);
++ sum = compensate_alignment(sum);
+ sum = chunk_internet_checksum_inc(chunk_create(chunk.ptr+9, 10), sum);
+- sum = ntohs(sum);
++ sum = compensate_alignment(sum);
+ ck_assert_int_eq(0x4459, ntohs(sum));
+ }
+ END_TEST