Keep alignment to prevent from bus error.
authorSung-jae Park <nicesj.park@samsung.com>
Tue, 28 Jan 2014 11:09:33 +0000 (20:09 +0900)
committerSung-jae Park <nicesj.park@samsung.com>
Tue, 28 Jan 2014 11:17:50 +0000 (20:17 +0900)
Change-Id: I29dc6393c1891d74efbd886ccf36dcb58eff42e0

packaging/libcom-core.spec
src/packet.c

index 4cc9b64..754b0e7 100644 (file)
@@ -1,6 +1,6 @@
 Name: libcom-core
 Summary: Library for the light-weight IPC 
-Version: 0.5.7
+Version: 0.5.8
 Release: 1
 Group: Base/IPC
 License: Apache-2.0
index 6057b56..2cb99f8 100644 (file)
@@ -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':