radio: fix 64 bit process compatibility
Fix binder call implementations and shared memory layout to make sure
that structures containig a pointer to metadata buffer are passed
correctly between 32 bit and 64 bit processes.
Change-Id: Ibecf260555225e0764411f62b60831511cb68278
diff --git a/radio/Radio.cpp b/radio/Radio.cpp
index 3c04fb0..fa39589 100644
--- a/radio/Radio.cpp
+++ b/radio/Radio.cpp
@@ -240,20 +240,31 @@
return;
}
+ // The event layout in shared memory is:
+ // sizeof(struct radio_event) bytes : the event itself
+ // 4 bytes : metadata size or 0
+ // N bytes : metadata if present
struct radio_event *event = (struct radio_event *)eventMemory->pointer();
+ uint32_t metadataOffset = sizeof(struct radio_event) + sizeof(uint32_t);
+ uint32_t metadataSize = *(uint32_t *)((uint8_t *)event + metadataOffset - sizeof(uint32_t));
+
// restore local metadata pointer from offset
switch (event->type) {
case RADIO_EVENT_TUNED:
case RADIO_EVENT_AF_SWITCH:
- if (event->info.metadata != NULL) {
+ if (metadataSize != 0) {
event->info.metadata =
- (radio_metadata_t *)((char *)event + (size_t)event->info.metadata);
+ (radio_metadata_t *)((uint8_t *)event + metadataOffset);
+ } else {
+ event->info.metadata = 0;
}
break;
case RADIO_EVENT_METADATA:
- if (event->metadata != NULL) {
+ if (metadataSize != 0) {
event->metadata =
- (radio_metadata_t *)((char *)event + (size_t)event->metadata);
+ (radio_metadata_t *)((uint8_t *)event + metadataOffset);
+ } else {
+ event->metadata = 0;
}
break;
default: