e xsettings - fix warnings about unaligned ptr access

this moves access to byte by byte memcpy's to avoid potential
unaligned access.
This commit is contained in:
Carsten Haitzler 2017-02-12 15:14:23 +09:00
parent b40fd20fbc
commit 8c70210ee6
1 changed files with 27 additions and 11 deletions

View File

@ -273,13 +273,16 @@ _e_xsettings_copy(unsigned char *buffer, Setting *s)
{ {
size_t str_len; size_t str_len;
size_t len; size_t len;
C16 tmp16;
C32 tmp32;
buffer[0] = s->type; buffer[0] = s->type;
buffer[1] = 0; buffer[1] = 0;
buffer += 2; buffer += 2;
str_len = strlen(s->name); str_len = strlen(s->name);
*(C16 *)(buffer) = str_len; tmp16 = str_len;
memcpy(buffer, &tmp16, sizeof(C16));
buffer += 2; buffer += 2;
memcpy(buffer, s->name, str_len); memcpy(buffer, s->name, str_len);
@ -289,19 +292,22 @@ _e_xsettings_copy(unsigned char *buffer, Setting *s)
memset(buffer, 0, len); memset(buffer, 0, len);
buffer += len; buffer += len;
*(C32 *)(buffer) = s->last_change; tmp32 = s->last_change;
memcpy(buffer, &tmp32, sizeof(C32));
buffer += 4; buffer += 4;
switch (s->type) switch (s->type)
{ {
case SETTING_TYPE_INT: case SETTING_TYPE_INT:
*(C32 *)(buffer) = s->i.value; tmp32 = s->i.value;
memcpy(buffer, &tmp32, sizeof(C32));
buffer += 4; buffer += 4;
break; break;
case SETTING_TYPE_STRING: case SETTING_TYPE_STRING:
str_len = strlen(s->s.value); str_len = strlen(s->s.value);
*(C32 *)(buffer) = str_len; tmp32 = str_len;
memcpy(buffer, &tmp32, sizeof(C32));
buffer += 4; buffer += 4;
memcpy(buffer, s->s.value, str_len); memcpy(buffer, s->s.value, str_len);
@ -313,11 +319,18 @@ _e_xsettings_copy(unsigned char *buffer, Setting *s)
break; break;
case SETTING_TYPE_COLOR: case SETTING_TYPE_COLOR:
*(C16 *)(buffer) = s->c.red; tmp16 = s->c.red;
*(C16 *)(buffer + 2) = s->c.green; memcpy(buffer, &tmp16, sizeof(C16));
*(C16 *)(buffer + 4) = s->c.blue; buffer += 2;
*(C16 *)(buffer + 6) = s->c.alpha; tmp16 = s->c.green;
buffer += 8; memcpy(buffer, &tmp16, sizeof(C16));
buffer += 2;
tmp16 = s->c.blue;
memcpy(buffer, &tmp16, sizeof(C16));
buffer += 2;
tmp16 = s->c.alpha;
memcpy(buffer, &tmp16, sizeof(C16));
buffer += 2;
break; break;
} }
@ -332,6 +345,7 @@ _e_xsettings_apply(Settings_Manager *sm)
size_t len = 12; size_t len = 12;
Setting *s; Setting *s;
Eina_List *l; Eina_List *l;
C32 tmp32;
EINA_LIST_FOREACH(settings, l, s) EINA_LIST_FOREACH(settings, l, s)
len += s->length; len += s->length;
@ -346,9 +360,11 @@ _e_xsettings_apply(Settings_Manager *sm)
#endif #endif
pos += 4; pos += 4;
*(C32 *)pos = sm->serial++; tmp32 = sm->serial++;
memcpy(pos, &tmp32, sizeof(C32));
pos += 4; pos += 4;
*(C32 *)pos = eina_list_count(settings); tmp32 = eina_list_count(settings);
memcpy(pos, &tmp32, sizeof(C32));
pos += 4; pos += 4;
EINA_LIST_FOREACH(settings, l, s) EINA_LIST_FOREACH(settings, l, s)