forked from enlightenment/enlightenment
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:
parent
f72aa5671d
commit
2110cdea89
|
@ -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
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue