]> source.dussan.org Git - tigervnc.git/commitdiff
Abort argument processing on error.
authorTim Waugh <twaugh@redhat.com>
Wed, 18 Feb 2015 14:55:11 +0000 (14:55 +0000)
committerTim Waugh <twaugh@redhat.com>
Wed, 18 Feb 2015 14:56:40 +0000 (14:56 +0000)
This prevents e.g. 'Xvnc -screen x' crashing.

unix/xserver/hw/vnc/xvnc.c

index e49ac77fab082bf7620a40ab8c39e2d4afe21691..c668bde25365f877d4013ebcd235a088e8975d80 100644 (file)
@@ -346,6 +346,13 @@ Bool displayNumFree(int num)
     return TRUE;
 }
 
+#define fail_unless_args(_argc,_i,_n)          \
+    if (_i + _n >= _argc)                      \
+    {                                          \
+        UseMsg();                              \
+        return 0;                              \
+    }
+
 int 
 ddxProcessArgument(int argc, char *argv[], int i)
 {
@@ -365,12 +372,13 @@ ddxProcessArgument(int argc, char *argv[], int i)
     if (strcmp (argv[i], "-screen") == 0)      /* -screen n WxHxD */
     {
        int screenNum;
-       if (i + 2 >= argc) UseMsg();
+       fail_unless_args(argc, i, 2);
        screenNum = atoi(argv[i+1]);
        if (screenNum < 0 || screenNum >= MAXSCREENS)
        {
            ErrorF("Invalid screen number %d\n", screenNum);
            UseMsg();
+           return 0;
        }
        if (3 != sscanf(argv[i+2], "%dx%dx%d",
                        &vfbScreens[screenNum].fb.width,
@@ -379,6 +387,7 @@ ddxProcessArgument(int argc, char *argv[], int i)
        {
            ErrorF("Invalid screen configuration %s\n", argv[i+2]);
            UseMsg();
+           return 0;
        }
 
        if (screenNum >= vfbNumScreens)
@@ -391,13 +400,15 @@ ddxProcessArgument(int argc, char *argv[], int i)
     {
        int depth, ret = 1;
 
-       if (++i >= argc) UseMsg();
+       fail_unless_args(argc, i, 1);
+       ++i;
        while ((i < argc) && (depth = atoi(argv[i++])) != 0)
        {
            if (depth < 0 || depth > 32)
            {
                ErrorF("Invalid pixmap depth %d\n", depth);
                UseMsg();
+               return;
            }
            vfbPixmapDepths[depth] = TRUE;
            ret++;
@@ -420,7 +431,8 @@ ddxProcessArgument(int argc, char *argv[], int i)
     if (strcmp (argv[i], "-blackpixel") == 0)  /* -blackpixel n */
     {
        Pixel pix;
-       if (++i >= argc) UseMsg();
+       fail_unless_args(argc, i, 1);
+       ++i;
        pix = atoi(argv[i]);
        if (-1 == lastScreen)
        {
@@ -440,7 +452,8 @@ ddxProcessArgument(int argc, char *argv[], int i)
     if (strcmp (argv[i], "-whitepixel") == 0)  /* -whitepixel n */
     {
        Pixel pix;
-       if (++i >= argc) UseMsg();
+       fail_unless_args(argc, i, 1);
+       ++i;
        pix = atoi(argv[i]);
        if (-1 == lastScreen)
        {
@@ -460,7 +473,8 @@ ddxProcessArgument(int argc, char *argv[], int i)
     if (strcmp (argv[i], "-linebias") == 0)    /* -linebias n */
     {
        unsigned int linebias;
-       if (++i >= argc) UseMsg();
+       fail_unless_args(argc, i, 1);
+       ++i;
        linebias = atoi(argv[i]);
        if (-1 == lastScreen)
        {
@@ -487,18 +501,21 @@ ddxProcessArgument(int argc, char *argv[], int i)
     
     if (strcmp(argv[i], "-geometry") == 0)
     {
-       if (++i >= argc) UseMsg();
+       fail_unless_args(argc, i, 1);
+       ++i;
        if (sscanf(argv[i],"%dx%d",&vfbScreens[0].fb.width,
                   &vfbScreens[0].fb.height) != 2) {
            ErrorF("Invalid geometry %s\n", argv[i]);
            UseMsg();
+           return 0;
        }
        return 2;
     }
     
     if (strcmp(argv[i], "-depth") == 0)
     {
-       if (++i >= argc) UseMsg();
+       fail_unless_args(argc, i, 1);
+       ++i;
        vfbScreens[0].fb.depth = atoi(argv[i]);
        return 2;
     }
@@ -507,10 +524,12 @@ ddxProcessArgument(int argc, char *argv[], int i)
     {
        char rgbbgr[4];
        int bits1, bits2, bits3;
-       if (++i >= argc) UseMsg();
+       fail_unless_args(argc, i, 1);
+       ++i;
        if (sscanf(argv[i], "%3s%1d%1d%1d", rgbbgr,&bits1,&bits2,&bits3) < 4) {
            ErrorF("Invalid pixel format %s\n", argv[i]);
            UseMsg();
+           return 0;
        }
 
 #define SET_PIXEL_FORMAT(vfbScreen)                     \
@@ -528,6 +547,7 @@ ddxProcessArgument(int argc, char *argv[], int i)
     } else {                                            \
         ErrorF("Invalid pixel format %s\n", argv[i]);   \
         UseMsg();                                       \
+        return 0;                                      \
     }
 
        if (-1 == lastScreen)