volume-api: Fix strict-aliasing warnings 86/30986/2
authorTanu Kaskinen <tanu.kaskinen@linux.intel.com>
Tue, 30 Sep 2014 09:29:06 +0000 (12:29 +0300)
committerJaska Uimonen <jaska.uimonen@intel.com>
Thu, 11 Dec 2014 18:58:52 +0000 (10:58 -0800)
It's apparently not safe to reinterpret the memory stored in double
variables as uint64_t, so let's use memcpy().

Change-Id: If6474f2d047c92d9dd7607ed5692ccd08f78b5f3

src/modules/volume-api/module-volume-api.c
src/pulse/ext-volume-api.c

index 7b112f6..e7ecdcb 100644 (file)
@@ -235,8 +235,12 @@ static void fill_volume_control_info(pa_tagstruct *tagstruct, pa_volume_control
     pa_tagstruct_put_volume(tagstruct, control->volume.volume);
     pa_tagstruct_put_channel_map(tagstruct, &control->volume.channel_map);
 
-    for (i = 0; i < control->volume.channel_map.channels; i++)
-        pa_tagstruct_putu64(tagstruct, *((uint64_t *) &control->volume.balance[i]));
+    for (i = 0; i < control->volume.channel_map.channels; i++) {
+        uint64_t u;
+
+        memcpy(&u, &control->volume.balance[i], sizeof(uint64_t));
+        pa_tagstruct_putu64(tagstruct, u);
+    }
 
     pa_tagstruct_put_boolean(tagstruct, control->convertible_to_dB);
 }
@@ -404,7 +408,7 @@ static int command_set_volume_control_volume(struct userdata *u, pa_native_conne
             if (pa_tagstruct_getu64(tagstruct, &balance) < 0)
                 goto fail_parse;
 
-            bvolume.balance[i] = *((double *) &balance);
+            memcpy(&bvolume.balance[i], &balance, sizeof(double));
 
             if (!pa_balance_valid(bvolume.balance[i]))
                 goto fail_parse;
index b81909a..ad514b5 100644 (file)
@@ -852,7 +852,7 @@ static void get_volume_control_info_cb(pa_pdispatch *pdispatch, uint32_t command
                 if (pa_tagstruct_getu64(tagstruct, &balance) < 0)
                     goto fail_parse;
 
-                info.volume.balance[channel] = *((double *) &balance);
+                memcpy(&info.volume.balance[channel], &balance, sizeof(double));
 
                 if (!pa_ext_volume_api_balance_valid(info.volume.balance[channel]))
                     goto fail_parse;
@@ -1021,8 +1021,12 @@ pa_operation *pa_ext_volume_api_set_volume_control_volume_by_index(pa_context *c
     pa_tagstruct_put_volume(tagstruct, v);
     pa_tagstruct_put_channel_map(tagstruct, &channel_map);
 
-    for (i = 0; i < channel_map.channels; i++)
-        pa_tagstruct_putu64(tagstruct, *((uint64_t *) &volume->balance[i]));
+    for (i = 0; i < channel_map.channels; i++) {
+        uint64_t balance;
+
+        memcpy(&balance, &volume->balance[i], sizeof(uint64_t));
+        pa_tagstruct_putu64(tagstruct, balance);
+    }
 
     pa_pstream_send_tagstruct(context->pstream, tagstruct);
     pa_pdispatch_register_reply(context->pdispatch, tag, DEFAULT_TIMEOUT, pa_context_simple_ack_callback,
@@ -1074,8 +1078,12 @@ pa_operation *pa_ext_volume_api_set_volume_control_volume_by_name(pa_context *co
     pa_tagstruct_put_volume(tagstruct, v);
     pa_tagstruct_put_channel_map(tagstruct, &channel_map);
 
-    for (i = 0; i < channel_map.channels; i++)
-        pa_tagstruct_putu64(tagstruct, *((uint64_t *) &volume->balance[i]));
+    for (i = 0; i < channel_map.channels; i++) {
+        uint64_t balance;
+
+        memcpy(&balance, &volume->balance[i], sizeof(uint64_t));
+        pa_tagstruct_putu64(tagstruct, balance);
+    }
 
     pa_pstream_send_tagstruct(context->pstream, tagstruct);
     pa_pdispatch_register_reply(context->pdispatch, tag, DEFAULT_TIMEOUT, pa_context_simple_ack_callback,