apexsink: Use a union to avoid type-punning strict aliasing compiler warning.
authorJan Schmidt <thaytan@noraisin.net>
Fri, 27 Feb 2009 10:16:57 +0000 (10:16 +0000)
committerJan Schmidt <thaytan@noraisin.net>
Fri, 27 Feb 2009 10:41:43 +0000 (10:41 +0000)
ext/apexsink/gstapexraop.c

index 42b707caa2d9af1af2a00680f33e998feebf8a5a..98b7d863414b161411c319a79282e8863075a597 100644 (file)
@@ -231,7 +231,17 @@ gst_apexraop_connect (GstApExRAOP * con)
       creq[GST_APEX_RAOP_SDP_DEFAULT_LENGTH],
       hreq[GST_APEX_RAOP_HDR_DEFAULT_LENGTH], *req;
   RSA *rsa;
-  guchar *mod, *exp, buf[4 + 8 + 16], rsakey[512];
+  guchar *mod, *exp, rsakey[512];
+  union gst_randbytes
+  {
+    struct asvals
+    {
+      gulong url_key;
+      guint64 conn_id;
+      guchar challenge[16];
+    } v;
+    guchar buf[4 + 8 + 16];
+  } randbuf;
   gsize size;
   struct sockaddr_in ioaddr;
   socklen_t iolen;
@@ -257,12 +267,9 @@ gst_apexraop_connect (GstApExRAOP * con)
           sizeof (conn->ctrl_sd_in)) < 0)
     return GST_RTSP_STS_DESTINATION_UNREACHABLE;
 
-  RAND_bytes (buf, sizeof (buf));
-  sprintf ((gchar *) conn->url_abspath, "%lu", *((gulong *) buf));
-  ac = g_base64_encode (buf + 12, 16);
-  g_strdel (ac, '=');
-  sprintf ((char *) conn->cid, "%08lx%08lx", *((gulong *) (buf + 4)),
-      *((gulong *) (buf + 8)));
+  RAND_bytes (randbuf.buf, sizeof (randbuf));
+  sprintf ((gchar *) conn->url_abspath, "%lu", randbuf.v.url_key);
+  sprintf ((char *) conn->cid, "%16" G_GINT64_MODIFIER "x", randbuf.v.conn_id);
 
   RAND_bytes (conn->aes_ky, AES_BLOCK_SIZE);
   RAND_bytes (conn->aes_iv, AES_BLOCK_SIZE);
@@ -285,6 +292,9 @@ gst_apexraop_connect (GstApExRAOP * con)
   getsockname (conn->ctrl_sd, (struct sockaddr *) &ioaddr, &iolen);
   inet_ntop (AF_INET, &(ioaddr.sin_addr), inaddr, INET_ADDRSTRLEN);
 
+  ac = g_base64_encode (randbuf.v.challenge, 16);
+  g_strdel (ac, '=');
+
   sprintf (creq,
       "v=0\r\n"
       "o=iTunes %s 0 IN IP4 %s\r\n"