diff options
author | Bernhard Reutner-Fischer <rep.dot.nop@gmail.com> | 2009-02-18 15:28:43 +0000 |
---|---|---|
committer | Bernhard Reutner-Fischer <rep.dot.nop@gmail.com> | 2009-02-18 15:28:43 +0000 |
commit | 7307e06122997f3d5e0108cd1bab4b11a1d5ebdc (patch) | |
tree | d09cc810940608072ea56d070b9811d0da3dfe25 | |
parent | 8dcb33c3eb97ca668f609baf790fc79ac3f9da1c (diff) | |
download | busybox-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.c | 4 | ||||
-rw-r--r-- | util-linux/fbset.c | 38 |
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 | ||
175 | static int readmode(struct fb_var_screeninfo *base, const char *fn, | 177 | static 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 | ||