mirror of
https://github.com/Rockbox/rockbox.git
synced 2025-10-14 10:37:38 -04:00
avoid overflow in puts_scroll().
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@26231 a1c6a512-1295-4272-9138-f99709370657
This commit is contained in:
parent
e2d1eb6fc8
commit
0ac61bffa7
2 changed files with 10 additions and 5 deletions
|
@ -321,6 +321,7 @@ void LCDFN(puts_scroll_style_offset)(int x, int y, const unsigned char *string,
|
||||||
struct scrollinfo* s;
|
struct scrollinfo* s;
|
||||||
char *end;
|
char *end;
|
||||||
int w, h;
|
int w, h;
|
||||||
|
int len;
|
||||||
|
|
||||||
if ((unsigned)y >= (unsigned)current_vp->height)
|
if ((unsigned)y >= (unsigned)current_vp->height)
|
||||||
return;
|
return;
|
||||||
|
@ -358,13 +359,14 @@ void LCDFN(puts_scroll_style_offset)(int x, int y, const unsigned char *string,
|
||||||
s->bidir = false;
|
s->bidir = false;
|
||||||
|
|
||||||
if (!s->bidir) { /* add spaces if scrolling in the round */
|
if (!s->bidir) { /* add spaces if scrolling in the round */
|
||||||
strcat(s->line, " ");
|
strlcat(s->line, " ", sizeof s->line);
|
||||||
/* get new width incl. spaces */
|
/* get new width incl. spaces */
|
||||||
s->width = LCDFN(getstringsize)(s->line, &w, &h);
|
s->width = LCDFN(getstringsize)(s->line, &w, &h);
|
||||||
}
|
}
|
||||||
|
|
||||||
end = strchr(s->line, '\0');
|
end = strchr(s->line, '\0');
|
||||||
strlcpy(end, string, current_vp->width/2);
|
len = sizeof s->line - (end - s->line);
|
||||||
|
strlcpy(end, string, MIN(current_vp->width/2, len));
|
||||||
|
|
||||||
s->vp = current_vp;
|
s->vp = current_vp;
|
||||||
s->y = y;
|
s->y = y;
|
||||||
|
|
|
@ -513,9 +513,10 @@ void lcd_puts_scroll_offset(int x, int y, const unsigned char *string,
|
||||||
{
|
{
|
||||||
/* prepare scroll line */
|
/* prepare scroll line */
|
||||||
char *end;
|
char *end;
|
||||||
|
int count;
|
||||||
|
|
||||||
memset(s->line, 0, sizeof s->line);
|
memset(s->line, 0, sizeof s->line);
|
||||||
strcpy(s->line, string);
|
strlcpy(s->line, string, sizeof s->line);
|
||||||
|
|
||||||
/* get width */
|
/* get width */
|
||||||
s->len = utf8length(s->line);
|
s->len = utf8length(s->line);
|
||||||
|
@ -531,13 +532,15 @@ void lcd_puts_scroll_offset(int x, int y, const unsigned char *string,
|
||||||
|
|
||||||
if (!s->bidir) /* add spaces if scrolling in the round */
|
if (!s->bidir) /* add spaces if scrolling in the round */
|
||||||
{
|
{
|
||||||
strcat(s->line, " ");
|
strlcat(s->line, " ", sizeof s->line);
|
||||||
/* get new width incl. spaces */
|
/* get new width incl. spaces */
|
||||||
s->len += SCROLL_SPACING;
|
s->len += SCROLL_SPACING;
|
||||||
}
|
}
|
||||||
|
|
||||||
end = strchr(s->line, '\0');
|
end = strchr(s->line, '\0');
|
||||||
strlcpy(end, string, utf8seek(s->line, current_vp->width));
|
len = sizeof s->line - (end - s->line);
|
||||||
|
count = utf8seek(s->line, current_vp->width);
|
||||||
|
strlcpy(end, string, MIN(count, len));
|
||||||
|
|
||||||
s->vp = current_vp;
|
s->vp = current_vp;
|
||||||
s->y = y;
|
s->y = y;
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue