e systray/indicator protocol pixmap data fetch fix

this fixes several issues in the pixmap data fetching

1. it over-read the input buffer assuming ints count instead it has
byte count for length
2. it would leak memory if you have multiple pixmaps and the largest
was not the first found.
3. it always swapped pixel bytes instead of only on little endian.

this should fix T5910
This commit is contained in:
Carsten Haitzler 2018-03-10 15:21:18 +09:00 committed by Simon Lees
parent 348e57123c
commit eba3bec170
1 changed files with 25 additions and 7 deletions

View File

@ -75,17 +75,35 @@ icon_pixmap_deserialize(Eldbus_Message_Iter *variant, uint32_t **data, int *w, i
int len;
//only take this img if it has a higher resolution
if (tmpw > *w || tmph > *h)
if ((tmpw > *w) || (tmph > *h))
{
*w = tmpw;
*h = tmph;
if (eldbus_message_iter_fixed_array_get(imgdata, 'y', &img, &len))
{
unsigned int pos;
unsigned int sz;
*data = malloc(len * sizeof(int));
for (pos = 0; pos < (unsigned int)len; pos++)
(*data)[pos] = eina_swap32(img[pos]);
sz = tmpw * tmph;
if ((unsigned int)len == (sz * 4))
{
uint32_t *tmp;
tmp = malloc(tmpw * tmph * 4);
if (tmp)
{
uint32_t *s, *d, *e;
if (*data) free(*data);
*data = tmp;
*w = tmpw;
*h = tmph;
for (s = img, e = img + sz, d = *data;
s < e; s++, d++)
#if (defined __BYTE_ORDER && __BYTE_ORDER == __LITTLE_ENDIAN) || (__BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__)
*d = eina_swap32(*s);
#else
*d = *s;
#endif
}
}
}
}
}