]> granicus.if.org Git - curl/commitdiff
Fix portability issue related with unaligned memory access
authorYang Tse <yangsita@gmail.com>
Wed, 3 Feb 2010 06:49:27 +0000 (06:49 +0000)
committerYang Tse <yangsita@gmail.com>
Wed, 3 Feb 2010 06:49:27 +0000 (06:49 +0000)
lib/rtsp.c
tests/libtest/lib571.c

index 873b15f5f9f820c1bc570ac5c2d4754d193815e8..efbdf5d7aeede2a198a4b79db77bb643d4c07ce6 100644 (file)
  */
 
 
+#define RTP_PKT_CHANNEL(p)   ((int)((unsigned char)((p)[1])))
+
+#define RTP_PKT_LENGTH(p)  ((((int)((unsigned char)((p)[2]))) << 8) | \
+                             ((int)((unsigned char)((p)[3]))))
+
 static int rtsp_getsock_do(struct connectdata *conn,
                            curl_socket_t *socks,
                            int numsocks);
@@ -544,16 +549,14 @@ CURLcode Curl_rtsp_rtp_readwrite(struct SessionHandle *data,
   while((rtp_dataleft > 0) &&
         (rtp[0] == '$')) {
     if(rtp_dataleft > 4) {
-      char channel;
       int rtp_length;
 
       /* Parse the header */
       /* The channel identifier immediately follows and is 1 byte */
-      channel = rtp[1];
-      rtspc->rtp_channel = (int) channel;
+      rtspc->rtp_channel = RTP_PKT_CHANNEL(rtp);
 
       /* The length is two bytes */
-      rtp_length = ntohs( *((unsigned short *)(&rtp[2])) );
+      rtp_length = RTP_PKT_LENGTH(rtp);
 
       if(rtp_dataleft < rtp_length + 4) {
         /* Need more - incomplete payload*/
index f69151467f38ee9db5f0b9491e556b9fcff889b8..a1cd032ab659f1c09925355db9d547cebc394c80 100644 (file)
 
 #include "memdebug.h"
 
+#define RTP_PKT_CHANNEL(p)   ((int)((unsigned char)((p)[1])))
+
+#define RTP_PKT_LENGTH(p)  ((((int)((unsigned char)((p)[2]))) << 8) | \
+                             ((int)((unsigned char)((p)[3]))))
+
 #define RTP_DATA_SIZE 12
 static const char *RTP_DATA = "$_1234\n\0asdf";
 
@@ -40,16 +45,18 @@ static int rtp_packet_count = 0;
 
 static size_t rtp_write(void *ptr, size_t size, size_t nmemb, void *stream) {
   char *data = (char *)ptr;
-  int channel = (int)data[1];
-  int message_size = (int)(size * nmemb - 4);
-  unsigned short coded_size = ntohs(*((unsigned short*)(&data[2])));
+  int channel = RTP_PKT_CHANNEL(data);
+  int message_size = (int)(size * nmemb) - 4;
+  int coded_size = RTP_PKT_LENGTH(data);
+  size_t failure = (size * nmemb) ? 0 : 1;
   int i;
   (void)stream;
 
   printf("RTP: message size %d, channel %d\n", message_size, channel);
-  if((unsigned short) message_size != coded_size) {
-      printf("RTP embedded size (%hu) does not match the write size (%d).\n",
-              coded_size, message_size);
+  if(message_size != coded_size) {
+    printf("RTP embedded size (%d) does not match the write size (%d).\n",
+           coded_size, message_size);
+    return failure;
   }
 
   data += 4;
@@ -57,11 +64,13 @@ static size_t rtp_write(void *ptr, size_t size, size_t nmemb, void *stream) {
     if(message_size - i > RTP_DATA_SIZE) {
       if(memcmp(RTP_DATA, data + i, RTP_DATA_SIZE) != 0) {
         printf("RTP PAYLOAD CORRUPTED [%s]\n", data + i);
+        return failure;
       }
     } else {
       if (memcmp(RTP_DATA, data + i, message_size - i) != 0) {
         printf("RTP PAYLOAD END CORRUPTED (%d), [%s]\n",
                message_size - i, data + i);
+        return failure;
       }
     }
   }