- bail out if screen resolution does not match PPM dimensions.
authorBernhard Reutner-Fischer <rep.dot.nop@gmail.com>
Wed, 18 Feb 2009 15:28:43 +0000 (15:28 -0000)
committerBernhard Reutner-Fischer <rep.dot.nop@gmail.com>
Wed, 18 Feb 2009 15:28:43 +0000 (15:28 -0000)
  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.

miscutils/fbsplash.c
util-linux/fbset.c

index 1ea5d8ebb21a67411130eb2b2ef6cb70e663ac65..ec0f092dcb88c670d9b56300bea0ae3dac5a292e 100644 (file)
@@ -257,7 +257,9 @@ static void fb_drawimage(void)
 
        if (ENABLE_FEATURE_CLEAN_UP)
                free(head);
-
+       if (width != G.scr_var.xres || height != G.scr_var.yres)
+               bb_error_msg_and_die("PPM %dx%d does not match screen %dx%d",
+                                                        width, height, G.scr_var.xres, G.scr_var.yres);
        line_size = width*3;
        if (width > G.scr_var.xres)
                width = G.scr_var.xres;
index 590918aabc9af9f2ab12ae142ec5dd5554bc42e8..e0081667fada09911d7557c6c71010a8682eb1b1 100644 (file)
@@ -30,7 +30,8 @@ enum {
 /*     CMD_XCOMPAT =     10, */
        CMD_ALL = 11,
        CMD_INFO = 12,
-       CMD_CHANGE = 13,
+       CMD_SHOW = 13,
+       CMD_CHANGE = 14,
 
 #if ENABLE_FEATURE_FBSET_FANCY
        CMD_XRES = 100,
@@ -123,7 +124,8 @@ static const struct cmdoptions_t {
        { "vsync"   , 1, CMD_VSYNC    },
        { "laced"   , 1, CMD_LACED    },
        { "double"  , 1, CMD_DOUBLE   },
-       { "n"       , 0, CMD_CHANGE   },
+       { "show"    , 0, CMD_SHOW     },
+       { "s"       , 0, CMD_SHOW     },
 #if ENABLE_FEATURE_FBSET_FANCY
        { "all"     , 0, CMD_ALL      },
        { "xres"    , 1, CMD_XRES     },
@@ -172,7 +174,7 @@ static void ss(uint32_t *x, uint32_t flag, char *buf, const char *what)
                *x |= flag;
 }
 
-static int readmode(struct fb_var_screeninfo *base, const char *fn,
+static int read_mode_db(struct fb_var_screeninfo *base, const char *fn,
                                        const char *mode)
 {
        char *token[2], *p, *s;
@@ -302,7 +304,7 @@ int fbset_main(int argc, char **argv)
 {
        enum {
                OPT_CHANGE   = (1 << 0),
-               /*OPT_INFO     = (1 << 1), ??*/
+               OPT_SHOW     = (1 << 1),
                OPT_READMODE = (1 << 2),
                OPT_ALL      = (1 << 9),
        };
@@ -333,6 +335,12 @@ int fbset_main(int argc, char **argv)
                        case CMD_DB:
                                modefile = argv[1];
                                break;
+                       case CMD_ALL:
+                               options |= OPT_ALL;
+                               break;
+                       case CMD_SHOW:
+                               options |= OPT_SHOW;
+                               break;
                        case CMD_GEOMETRY:
                                varset.xres = xatou32(argv[1]);
                                varset.yres = xatou32(argv[2]);
@@ -349,12 +357,6 @@ int fbset_main(int argc, char **argv)
                                varset.hsync_len = xatou32(argv[6]);
                                varset.vsync_len = xatou32(argv[7]);
                                break;
-                       case CMD_ALL:
-                               options |= OPT_ALL;
-                               break;
-                       case CMD_CHANGE:
-                               options |= OPT_CHANGE;
-                               break;
 #if ENABLE_FEATURE_FBSET_FANCY
                        case CMD_XRES:
                                varset.xres = xatou32(argv[1]);
@@ -367,6 +369,15 @@ int fbset_main(int argc, char **argv)
                                break;
 #endif
                        }
+                       switch (g_cmdoptions[i].code) {
+                       case CMD_FB:
+                       case CMD_DB:
+                       case CMD_ALL:
+                       case CMD_SHOW:
+                               break;
+                       default:
+                               options |= OPT_CHANGE; /* the other commands imply changes */
+                       }
                        argc -= g_cmdoptions[i].param_count;
                        argv += g_cmdoptions[i].param_count;
                        goto contin;
@@ -384,19 +395,20 @@ int fbset_main(int argc, char **argv)
 #if !ENABLE_FEATURE_FBSET_READMODE
                bb_show_usage();
 #else
-               if (!readmode(&var, modefile, mode)) {
+               if (!read_mode_db(&var, modefile, mode)) {
                        bb_error_msg_and_die("unknown video mode '%s'", mode);
                }
 #endif
        }
 
-       setmode(&var, &varset);
        if (options & OPT_CHANGE) {
+               setmode(&var, &varset);
                if (options & OPT_ALL)
                        var.activate = FB_ACTIVATE_ALL;
                xioctl(fh, FBIOPUT_VSCREENINFO, &var);
        }
-       showmode(&var);
+       if (options == 0 || options & OPT_SHOW)
+               showmode(&var);
        /* Don't close the file, as exiting will take care of that */
        /* close(fh); */