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
parent f72aa5671d
commit 2110cdea89
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
}
}
}
}
}