shithub: opus-tools

Download patch

ref: f83bec968b08889825adb21535e4299eaa21e009
parent: db7bbf53eac7b4e3f7c65dcb22afc7e20eaa1dfc
author: Ralph Giles <giles@thaumas.net>
date: Sun Nov 4 17:03:48 EST 2012

Add a native-endian int32 reader. Fixes an ARM warning.

Arm (and other) architectures have stricter alignment requirements
thank x86, so just casting a char* to an int* and reading from it
could cause an exception, and because of this gcc warns on that
platform.

I'm pretty sure this particular read would always be aligned in
pracice, since it's the first word of the network packet returned
by pcap, but adding a more general helper is reasonable.

We memcpy() the value into a union, which the compiler should
allocate aligned, and then read the data back out as an int.

Thanks to Ron for reporting the issue, and Greg for suggesting
the fix.

--- a/src/opusrtp.c
+++ b/src/opusrtp.c
@@ -331,6 +331,19 @@
   return v;
 }
 
+/* helper, read a native-endian 32 bit int from memory */
+static int rne32(const unsigned char *p)
+{
+  /* On x86 we could just cast, but that might not meet
+   * arm's alignment requirements. */
+  union {
+    unsigned char c[4];
+    int d;
+  } m;
+  memcpy(m.c, p, 4);
+  return m.d;
+}
+
 int parse_eth_header(const unsigned char *packet, int size, eth_header *eth)
 {
   if (!packet || !eth) {
@@ -358,7 +371,7 @@
     return -1;
   }
   /* protocol is in host byte order */
-  loop->family = *(int*)packet;
+  loop->family = rne32(packet);
 
   return 0;
 }