summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSung-jae Park <nicesj.park@samsung.com>2014-01-28 15:19:02 -0800
committerGerrit Code Review <gerrit@review.vlan103.tizen.org>2014-01-28 15:19:02 -0800
commit9fcb4fbefd3692587d6623adb6504e257fc77ba8 (patch)
tree1d7703aa116fbeb11fc4d752607b30948da033a0
parent65bd5893adc75bd43870af097ff8fb0dd2f1fa62 (diff)
parent1ce8ea32c6b0943454823d642d961cd8b3e1c8f0 (diff)
downloadcom-core-accepted/tizen_generic.tar.gz
com-core-accepted/tizen_generic.tar.bz2
com-core-accepted/tizen_generic.zip
Merge "Keep address alignment to prevent from bus error." into tizensubmit/tizen/mobile/20140225.091425accepted/tizen_generic
-rw-r--r--packaging/libcom-core.spec2
-rw-r--r--src/packet.c37
2 files changed, 30 insertions, 9 deletions
diff --git a/packaging/libcom-core.spec b/packaging/libcom-core.spec
index 804dc92..29ec9c9 100644
--- a/packaging/libcom-core.spec
+++ b/packaging/libcom-core.spec
@@ -1,6 +1,6 @@
Name: libcom-core
Summary: Library for the light-weight IPC
-Version: 0.5.6
+Version: 0.5.7
Release: 1
Group: Base/IPC
License: Apache-2.0
diff --git a/src/packet.c b/src/packet.c
index 6057b56..2cb99f8 100644
--- a/src/packet.c
+++ b/src/packet.c
@@ -224,6 +224,7 @@ static inline struct packet *packet_body_filler(struct packet *packet, int paylo
{
char *payload;
char *str;
+ int align;
while (*ptr) {
payload = packet->data->payload + packet->data->head.payload_size;
@@ -231,7 +232,12 @@ static inline struct packet *packet_body_filler(struct packet *packet, int paylo
switch (*ptr) {
case 'i':
case 'I':
- packet->data->head.payload_size += sizeof(int);
+ align = (unsigned long)payload & (sizeof(int) - 1);
+ if (align) {
+ align = sizeof(int) - align;
+ }
+
+ packet->data->head.payload_size += sizeof(int) + align;
packet->data = check_and_expand_packet(packet->data, &payload_size);
if (!packet->data) {
packet->state = INVALID;
@@ -240,7 +246,7 @@ static inline struct packet *packet_body_filler(struct packet *packet, int paylo
goto out;
}
- *((int *)payload) = (int)va_arg(va, int);
+ *((int *)(payload + align)) = (int)va_arg(va, int);
break;
case 's':
case 'S':
@@ -272,7 +278,12 @@ static inline struct packet *packet_body_filler(struct packet *packet, int paylo
break;
case 'd':
case 'D':
- packet->data->head.payload_size += sizeof(double);
+ align = (unsigned long)payload & (sizeof(double) - 1);
+ if (align) {
+ align = sizeof(double) - align;
+ }
+
+ packet->data->head.payload_size += sizeof(double) + align;
packet->data = check_and_expand_packet(packet->data, &payload_size);
if (!packet->data) {
packet->state = INVALID;
@@ -281,7 +292,7 @@ static inline struct packet *packet_body_filler(struct packet *packet, int paylo
goto out;
}
- *((double *)payload) = (double)va_arg(va, double);
+ *((double *)(payload + align)) = (double)va_arg(va, double);
break;
default:
ErrPrint("Invalid type [%c]\n", *ptr);
@@ -459,6 +470,7 @@ EAPI int packet_get(const struct packet *packet, const char *fmt, ...)
int *int_ptr;
double *double_ptr;
char **str_ptr;
+ int align;
if (!packet || packet->state != VALID) {
return -EINVAL;
@@ -472,16 +484,25 @@ EAPI int packet_get(const struct packet *packet, const char *fmt, ...)
switch (*ptr) {
case 'i':
case 'I':
+ align = (unsigned long)payload & (sizeof(int) - 1);
+ if (align) {
+ align = sizeof(int) - align;
+ }
+
int_ptr = (int *)va_arg(va, int *);
- *int_ptr = *((int *)payload);
- offset += sizeof(int);
+ *int_ptr = *((int *)(payload + align));
+ offset += (sizeof(int) + align);
ret++;
break;
case 'd':
case 'D':
+ align = (unsigned long)payload & (sizeof(double) - 1);
+ if (align) {
+ align = sizeof(double) - align;
+ }
double_ptr = (double *)va_arg(va, double *);
- *double_ptr = *((double *)payload);
- offset += sizeof(double);
+ *double_ptr = *((double *)(payload + align));
+ offset += (sizeof(double) + align);
ret++;
break;
case 's':