summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorThomas Martitz <kugel@rockbox.org>2014-01-09 22:59:46 +0100
committerThomas Martitz <kugel@rockbox.org>2014-01-09 23:17:38 +0100
commit7ba2d0160b6b4bfd68fc1d0819858f7138e2d1d4 (patch)
treee1a185272ccaae14cb8c49befdac07e340a2abb9
parent3be3a4013829a5d088904803bdd26e339eea61f0 (diff)
downloadrockbox-7ba2d0160b6b4bfd68fc1d0819858f7138e2d1d4.tar.gz
rockbox-7ba2d0160b6b4bfd68fc1d0819858f7138e2d1d4.zip
put_line(): Limit and truncate inline strings to MAX_PATH+32.
Because inline strings have to be copied (to escape '$') the local buffer can be exhaused. The code didn't check for this. The buffer is increased to handle filenames plus some extra chars but truncates to avoid overflow. If you have longer strings please pass them via $t tag, in which case put_line() imposes no additional length-limitation. Change-Id: I0ca20adbe72f6d44cb442f34d665c16b12cbbaeb
-rw-r--r--apps/gui/line.c15
-rw-r--r--apps/gui/line.h11
2 files changed, 20 insertions, 6 deletions
diff --git a/apps/gui/line.c b/apps/gui/line.c
index 5a376c652c..d561f08c76 100644
--- a/apps/gui/line.c
+++ b/apps/gui/line.c
@@ -32,6 +32,7 @@
32#include "settings.h" 32#include "settings.h"
33#include "debug.h" 33#include "debug.h"
34#include "viewport.h" 34#include "viewport.h"
35#include "debug.h"
35 36
36#ifdef HAVE_REMOTE_LCD 37#ifdef HAVE_REMOTE_LCD
37#define MAX_LINES (LCD_SCROLLABLE_LINES + LCD_REMOTE_SCROLLABLE_LINES) 38#define MAX_LINES (LCD_SCROLLABLE_LINES + LCD_REMOTE_SCROLLABLE_LINES)
@@ -158,8 +159,8 @@ static void print_line(struct screen *display,
158 int xpos = x; 159 int xpos = x;
159 int icon_y, icon_h, icon_w; 160 int icon_y, icon_h, icon_w;
160 enum themable_icons icon; 161 enum themable_icons icon;
161 char tempbuf[128]; 162 char tempbuf[MAX_PATH+32];
162 int tempbuf_idx; 163 unsigned int tempbuf_idx;
163 164
164 height = line->height == -1 ? display->getcharheight() : line->height; 165 height = line->height == -1 ? display->getcharheight() : line->height;
165 icon_h = get_icon_height(display->screen_type); 166 icon_h = get_icon_height(display->screen_type);
@@ -246,7 +247,15 @@ next:
246 } 247 }
247 else 248 else
248 { /* handle string constant in format string */ 249 { /* handle string constant in format string */
249 tempbuf[tempbuf_idx++] = ch; 250 if (tempbuf_idx < sizeof(tempbuf)-1)
251 {
252 tempbuf[tempbuf_idx++] = ch;
253 }
254 else if (tempbuf_idx == sizeof(tempbuf)-1)
255 {
256 tempbuf[tempbuf_idx++] = '\0';
257 DEBUGF("%s ", ch ? "put_line: String truncated" : "");
258 }
250 if (!ch) 259 if (!ch)
251 { /* end of string. put it online */ 260 { /* end of string. put it online */
252 put_text(display, xpos, y, line, tempbuf, false, 0); 261 put_text(display, xpos, y, line, tempbuf, false, 0);
diff --git a/apps/gui/line.h b/apps/gui/line.h
index fa1522003c..9a0769de35 100644
--- a/apps/gui/line.h
+++ b/apps/gui/line.h
@@ -108,9 +108,14 @@ struct line_desc {
108 * $*t - skips the first n pixels when displaying the string. put_line() 108 * $*t - skips the first n pixels when displaying the string. put_line()
109 * expects a correspinding paramter of the type 'int' that specifies n. 109 * expects a correspinding paramter of the type 'int' that specifies n.
110 * 110 *
111 * Inline text will be printed as is and can be freely intermixed with tags, 111 * Inline text will be printed as is (be sure to escape '$') and can be freely
112 * except when the line can scroll. Due to limitations of the scroll engine 112 * intermixed with tags. Inline text will be truncated after MAX_PATH+31 bytes.
113 * only the last piece of text (whether inline or via $t) can scroll. 113 * If you have a longer inline string use a separate buffer and pass that via $t,
114 * which does not suffer from this truncation.
115 *
116 * Text can appear anywhere, before or after (or both) tags. However, when the
117 * line can scroll, only the last piece of text (whether inline or via $t) can
118 * scroll. This is due to a scroll_engine limitation.
114 * 119 *
115 * x, y - pixel postion of the line. 120 * x, y - pixel postion of the line.
116 * line - holds information for the line decorations 121 * line - holds information for the line decorations