Commit 381a4d6e authored by Yang Tse's avatar Yang Tse
Browse files

Fix portability issue related with unaligned memory access
parent f6d288a3
Loading
Loading
Loading
Loading
+7 −4
Original line number Diff line number Diff line
@@ -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*/
+15 −6
Original line number Diff line number Diff line
@@ -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",
  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;
      }
    }
  }