Infobar: Fix memleak in infobar_draw_statustext by replacing pointer to array
This commit is contained in:
@@ -171,8 +171,8 @@ infobar_draw_taglist(int sc)
|
|||||||
void
|
void
|
||||||
infobar_draw_statustext(int sc, char *str)
|
infobar_draw_statustext(int sc, char *str)
|
||||||
{
|
{
|
||||||
char *buf = NULL;
|
char buf[512] = { 0 };
|
||||||
char *strwc = NULL;
|
char strwc[512] = { 0 };
|
||||||
char col[8] = { 0 };
|
char col[8] = { 0 };
|
||||||
int i, j, c, k = 0;
|
int i, j, c, k = 0;
|
||||||
char *lastst;
|
char *lastst;
|
||||||
@@ -187,10 +187,12 @@ infobar_draw_statustext(int sc, char *str)
|
|||||||
lastst = infobar[sc].statustext;
|
lastst = infobar[sc].statustext;
|
||||||
|
|
||||||
infobar[sc].statustext = _strdup(str);
|
infobar[sc].statustext = _strdup(str);
|
||||||
strwc = _strdup(str);
|
strcpy(strwc, &str[sizeof(strwc)]);
|
||||||
|
|
||||||
/* Count how many color block there is and make a string without color block (\#....\)*/
|
/* Count how many color block there is and make a string without color block (\#....\)*/
|
||||||
for(i = j = c = 0; i < strlen(str); ++i, ++j)
|
for(i = j = c = 0;
|
||||||
|
i < ((strlen(str) > sizeof(strwc)) ? sizeof(strwc) : strlen(str));
|
||||||
|
++i, ++j)
|
||||||
{
|
{
|
||||||
if(str[i] == '\\' && str[i + 1] == '#' && str[i + 8] == '\\')
|
if(str[i] == '\\' && str[i + 1] == '#' && str[i + 8] == '\\')
|
||||||
{
|
{
|
||||||
@@ -211,14 +213,14 @@ infobar_draw_statustext(int sc, char *str)
|
|||||||
/* Draw text with its color */
|
/* Draw text with its color */
|
||||||
if(c)
|
if(c)
|
||||||
{
|
{
|
||||||
buf = _strdup(strwc);
|
strcpy(buf, strwc);
|
||||||
|
|
||||||
for(i = k; i < strlen(str); ++i, ++k)
|
for(i = k; i < strlen(str); ++i, ++k)
|
||||||
if(str[i] == '\\' && str[i + 1] == '#' && str[i + 8] == '\\')
|
if(str[i] == '\\' && str[i + 1] == '#' && str[i + 8] == '\\')
|
||||||
{
|
{
|
||||||
/* Store current color in col[] */
|
/* Store current color in col[] */
|
||||||
for(j = 0, ++i; str[i] != '\\'; col[j++] = str[i++]);
|
for(j = 0, ++i; str[i] != '\\'; col[j++] = str[i++]);
|
||||||
buf += k;
|
strcpy(buf, &buf[k]);
|
||||||
|
|
||||||
/* Draw a rectangle with the bar color to draw the text properly */
|
/* Draw a rectangle with the bar color to draw the text properly */
|
||||||
draw_rectangle(infobar[sc].bar->dr, (sgeo[sc].width - SHADH) - textw(buf),
|
draw_rectangle(infobar[sc].bar->dr, (sgeo[sc].width - SHADH) - textw(buf),
|
||||||
@@ -229,17 +231,14 @@ infobar_draw_statustext(int sc, char *str)
|
|||||||
draw_text(infobar[sc].bar->dr, (sgeo[sc].width - SHADH) - textw(buf),
|
draw_text(infobar[sc].bar->dr, (sgeo[sc].width - SHADH) - textw(buf),
|
||||||
FHINFOBAR, col, 0, buf);
|
FHINFOBAR, col, 0, buf);
|
||||||
|
|
||||||
buf = _strdup(strwc);
|
strcpy(buf, strwc);
|
||||||
++i;
|
++i;
|
||||||
}
|
}
|
||||||
|
|
||||||
free(buf);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
barwin_refresh(infobar[sc].bar);
|
barwin_refresh(infobar[sc].bar);
|
||||||
|
|
||||||
free(lastst);
|
free(lastst);
|
||||||
free(strwc);
|
|
||||||
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user