aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBernhard Reutner-Fischer <rep.dot.nop@gmail.com>2009-02-18 15:28:43 +0000
committerBernhard Reutner-Fischer <rep.dot.nop@gmail.com>2009-02-18 15:28:43 +0000
commit7307e06122997f3d5e0108cd1bab4b11a1d5ebdc (patch)
treed09cc810940608072ea56d070b9811d0da3dfe25
parent8dcb33c3eb97ca668f609baf790fc79ac3f9da1c (diff)
downloadbusybox-w32-7307e06122997f3d5e0108cd1bab4b11a1d5ebdc.tar.gz
busybox-w32-7307e06122997f3d5e0108cd1bab4b11a1d5ebdc.tar.bz2
busybox-w32-7307e06122997f3d5e0108cd1bab4b11a1d5ebdc.zip
- bail out if screen resolution does not match PPM dimensions.
Previously a 640x480 PPM on an e.g. 720x400 console would just segfault when reading the lines. While this bug should perhaps be fixed to handle such cases properly we just exit gracefully until somebody is willing to take care of it properly.
-rw-r--r--miscutils/fbsplash.c4
-rw-r--r--util-linux/fbset.c38
2 files changed, 28 insertions, 14 deletions
diff --git a/miscutils/fbsplash.c b/miscutils/fbsplash.c
index 1ea5d8ebb..ec0f092dc 100644
--- a/miscutils/fbsplash.c
+++ b/miscutils/fbsplash.c
@@ -257,7 +257,9 @@ static void fb_drawimage(void)
257 257
258 if (ENABLE_FEATURE_CLEAN_UP) 258 if (ENABLE_FEATURE_CLEAN_UP)
259 free(head); 259 free(head);
260 260 if (width != G.scr_var.xres || height != G.scr_var.yres)
261 bb_error_msg_and_die("PPM %dx%d does not match screen %dx%d",
262 width, height, G.scr_var.xres, G.scr_var.yres);
261 line_size = width*3; 263 line_size = width*3;
262 if (width > G.scr_var.xres) 264 if (width > G.scr_var.xres)
263 width = G.scr_var.xres; 265 width = G.scr_var.xres;
diff --git a/util-linux/fbset.c b/util-linux/fbset.c
index 590918aab..e0081667f 100644
--- a/util-linux/fbset.c
+++ b/util-linux/fbset.c
@@ -30,7 +30,8 @@ enum {
30/* CMD_XCOMPAT = 10, */ 30/* CMD_XCOMPAT = 10, */
31 CMD_ALL = 11, 31 CMD_ALL = 11,
32 CMD_INFO = 12, 32 CMD_INFO = 12,
33 CMD_CHANGE = 13, 33 CMD_SHOW = 13,
34 CMD_CHANGE = 14,
34 35
35#if ENABLE_FEATURE_FBSET_FANCY 36#if ENABLE_FEATURE_FBSET_FANCY
36 CMD_XRES = 100, 37 CMD_XRES = 100,
@@ -123,7 +124,8 @@ static const struct cmdoptions_t {
123 { "vsync" , 1, CMD_VSYNC }, 124 { "vsync" , 1, CMD_VSYNC },
124 { "laced" , 1, CMD_LACED }, 125 { "laced" , 1, CMD_LACED },
125 { "double" , 1, CMD_DOUBLE }, 126 { "double" , 1, CMD_DOUBLE },
126 { "n" , 0, CMD_CHANGE }, 127 { "show" , 0, CMD_SHOW },
128 { "s" , 0, CMD_SHOW },
127#if ENABLE_FEATURE_FBSET_FANCY 129#if ENABLE_FEATURE_FBSET_FANCY
128 { "all" , 0, CMD_ALL }, 130 { "all" , 0, CMD_ALL },
129 { "xres" , 1, CMD_XRES }, 131 { "xres" , 1, CMD_XRES },
@@ -172,7 +174,7 @@ static void ss(uint32_t *x, uint32_t flag, char *buf, const char *what)
172 *x |= flag; 174 *x |= flag;
173} 175}
174 176
175static int readmode(struct fb_var_screeninfo *base, const char *fn, 177static int read_mode_db(struct fb_var_screeninfo *base, const char *fn,
176 const char *mode) 178 const char *mode)
177{ 179{
178 char *token[2], *p, *s; 180 char *token[2], *p, *s;
@@ -302,7 +304,7 @@ int fbset_main(int argc, char **argv)
302{ 304{
303 enum { 305 enum {
304 OPT_CHANGE = (1 << 0), 306 OPT_CHANGE = (1 << 0),
305 /*OPT_INFO = (1 << 1), ??*/ 307 OPT_SHOW = (1 << 1),
306 OPT_READMODE = (1 << 2), 308 OPT_READMODE = (1 << 2),
307 OPT_ALL = (1 << 9), 309 OPT_ALL = (1 << 9),
308 }; 310 };
@@ -333,6 +335,12 @@ int fbset_main(int argc, char **argv)
333 case CMD_DB: 335 case CMD_DB:
334 modefile = argv[1]; 336 modefile = argv[1];
335 break; 337 break;
338 case CMD_ALL:
339 options |= OPT_ALL;
340 break;
341 case CMD_SHOW:
342 options |= OPT_SHOW;
343 break;
336 case CMD_GEOMETRY: 344 case CMD_GEOMETRY:
337 varset.xres = xatou32(argv[1]); 345 varset.xres = xatou32(argv[1]);
338 varset.yres = xatou32(argv[2]); 346 varset.yres = xatou32(argv[2]);
@@ -349,12 +357,6 @@ int fbset_main(int argc, char **argv)
349 varset.hsync_len = xatou32(argv[6]); 357 varset.hsync_len = xatou32(argv[6]);
350 varset.vsync_len = xatou32(argv[7]); 358 varset.vsync_len = xatou32(argv[7]);
351 break; 359 break;
352 case CMD_ALL:
353 options |= OPT_ALL;
354 break;
355 case CMD_CHANGE:
356 options |= OPT_CHANGE;
357 break;
358#if ENABLE_FEATURE_FBSET_FANCY 360#if ENABLE_FEATURE_FBSET_FANCY
359 case CMD_XRES: 361 case CMD_XRES:
360 varset.xres = xatou32(argv[1]); 362 varset.xres = xatou32(argv[1]);
@@ -367,6 +369,15 @@ int fbset_main(int argc, char **argv)
367 break; 369 break;
368#endif 370#endif
369 } 371 }
372 switch (g_cmdoptions[i].code) {
373 case CMD_FB:
374 case CMD_DB:
375 case CMD_ALL:
376 case CMD_SHOW:
377 break;
378 default:
379 options |= OPT_CHANGE; /* the other commands imply changes */
380 }
370 argc -= g_cmdoptions[i].param_count; 381 argc -= g_cmdoptions[i].param_count;
371 argv += g_cmdoptions[i].param_count; 382 argv += g_cmdoptions[i].param_count;
372 goto contin; 383 goto contin;
@@ -384,19 +395,20 @@ int fbset_main(int argc, char **argv)
384#if !ENABLE_FEATURE_FBSET_READMODE 395#if !ENABLE_FEATURE_FBSET_READMODE
385 bb_show_usage(); 396 bb_show_usage();
386#else 397#else
387 if (!readmode(&var, modefile, mode)) { 398 if (!read_mode_db(&var, modefile, mode)) {
388 bb_error_msg_and_die("unknown video mode '%s'", mode); 399 bb_error_msg_and_die("unknown video mode '%s'", mode);
389 } 400 }
390#endif 401#endif
391 } 402 }
392 403
393 setmode(&var, &varset);
394 if (options & OPT_CHANGE) { 404 if (options & OPT_CHANGE) {
405 setmode(&var, &varset);
395 if (options & OPT_ALL) 406 if (options & OPT_ALL)
396 var.activate = FB_ACTIVATE_ALL; 407 var.activate = FB_ACTIVATE_ALL;
397 xioctl(fh, FBIOPUT_VSCREENINFO, &var); 408 xioctl(fh, FBIOPUT_VSCREENINFO, &var);
398 } 409 }
399 showmode(&var); 410 if (options == 0 || options & OPT_SHOW)
411 showmode(&var);
400 /* Don't close the file, as exiting will take care of that */ 412 /* Don't close the file, as exiting will take care of that */
401 /* close(fh); */ 413 /* close(fh); */
402 414