{
char *payload;
char *str;
+ int align;
while (*ptr) {
payload = packet->data->payload + packet->data->head.payload_size;
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;
goto out;
}
- *((int *)payload) = (int)va_arg(va, int);
+ *((int *)(payload + align)) = (int)va_arg(va, int);
break;
case 's':
case 'S':
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;
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);
int *int_ptr;
double *double_ptr;
char **str_ptr;
+ int align;
if (!packet || packet->state != VALID) {
return -EINVAL;
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':