diff options
author | Sung-jae Park <nicesj.park@samsung.com> | 2014-01-28 15:19:02 -0800 |
---|---|---|
committer | Gerrit Code Review <gerrit@review.vlan103.tizen.org> | 2014-01-28 15:19:02 -0800 |
commit | 9fcb4fbefd3692587d6623adb6504e257fc77ba8 (patch) | |
tree | 1d7703aa116fbeb11fc4d752607b30948da033a0 | |
parent | 65bd5893adc75bd43870af097ff8fb0dd2f1fa62 (diff) | |
parent | 1ce8ea32c6b0943454823d642d961cd8b3e1c8f0 (diff) | |
download | com-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.spec | 2 | ||||
-rw-r--r-- | src/packet.c | 37 |
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': |