diff options
author | Kyuho Jo <kyuho.jo@samsung.com> | 2015-07-13 10:52:14 +0900 |
---|---|---|
committer | Kyuho Jo <kyuho.jo@samsung.com> | 2015-07-13 10:54:42 +0900 |
commit | aaf2a402d048349457fbe4573bef70164848a0f4 (patch) | |
tree | 9c9669da664b0242e40fd6279449a23a60fd593b | |
parent | cbfa6f24be3926280a35777f193c07689d6c4915 (diff) | |
download | com-core-aaf2a402d048349457fbe4573bef70164848a0f4.tar.gz com-core-aaf2a402d048349457fbe4573bef70164848a0f4.tar.bz2 com-core-aaf2a402d048349457fbe4573bef70164848a0f4.zip |
Fix the memory alignment issus by padding.tizen_3.0.m1_tv_releasetizen_3.0.m1_mobile_releasesubmit/tizen_common/20151026.085049submit/tizen_common/20151023.083358submit/tizen/20150713.020827accepted/tizen/wearable/20150713.060909accepted/tizen/tv/20150713.060858accepted/tizen/mobile/20150713.060851tizen_3.0.m1_tvtizen_3.0.m1_mobile
Change-Id: If30e154b77f23b72588fbf4cf9be1082d0d6f4e6
Signed-off-by: Kyuho Jo <kyuho.jo@samsung.com>
-rw-r--r-- | src/packet.c | 37 |
1 files changed, 29 insertions, 8 deletions
diff --git a/src/packet.c b/src/packet.c index ffdca79..a28bc6d 100644 --- a/src/packet.c +++ b/src/packet.c @@ -244,6 +244,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; @@ -251,7 +252,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; @@ -260,7 +266,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': @@ -292,7 +298,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; @@ -301,7 +312,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); @@ -502,6 +513,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; @@ -515,16 +527,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': |