diff options
author | Yang Tse <yangsita@gmail.com> | 2010-02-03 06:49:27 +0000 |
---|---|---|
committer | Yang Tse <yangsita@gmail.com> | 2010-02-03 06:49:27 +0000 |
commit | 381a4d6efec42db823cbd5946514c275bca7d2d1 (patch) | |
tree | 061eb754d2156ea5b143b79eb9e3f843684961bd | |
parent | f6d288a39740136c59ee14937f994ca5e1555016 (diff) |
Fix portability issue related with unaligned memory access
-rw-r--r-- | lib/rtsp.c | 11 | ||||
-rw-r--r-- | tests/libtest/lib571.c | 21 |
2 files changed, 22 insertions, 10 deletions
diff --git a/lib/rtsp.c b/lib/rtsp.c index 873b15f5f..efbdf5d7a 100644 --- a/lib/rtsp.c +++ b/lib/rtsp.c @@ -54,6 +54,11 @@ */ +#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*/ diff --git a/tests/libtest/lib571.c b/tests/libtest/lib571.c index f69151467..a1cd032ab 100644 --- a/tests/libtest/lib571.c +++ b/tests/libtest/lib571.c @@ -33,6 +33,11 @@ #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; } } } |