Should never happen, but has been reported as happening at least once:
http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=488535

Instead prints warning messages to stderr to help diagnose where the
bad visual information is coming from.

(Tested by temporarily commenting out names in the ClassName array.)

Signed-off-by: Alan Coopersmith <alan.coopersm...@oracle.com>
---
 xrdb.c |   28 ++++++++++++++++++++++------
 1 file changed, 22 insertions(+), 6 deletions(-)

diff --git a/xrdb.c b/xrdb.c
index b7c9fa3..d42a519 100644
--- a/xrdb.c
+++ b/xrdb.c
@@ -605,6 +605,8 @@ static char *ClassNames[] = {
     "DirectColor"
 };
 
+#define NUM_CLASS_NAMES (int)(sizeof(ClassNames) / sizeof(ClassNames[0]))
+
 static void
 DoScreenDefines(Display *display, int scrno, String *defs)
 {
@@ -625,9 +627,16 @@ DoScreenDefines(Display *display, int scrno, String *defs)
     AddNum(defs, "Y_RESOLUTION", Resolution(screen->height,screen->mheight));
     AddNum(defs, "PLANES", DisplayPlanes(display, scrno));
     AddNum(defs, "BITS_PER_RGB", visual->bits_per_rgb);
-    AddDefQ(defs, "CLASS", ClassNames[visual->class]);
-    snprintf(name, sizeof(name), "CLASS_%s", ClassNames[visual->class]);
-    AddNum(defs, name, (int)visual->visualid);
+    if (visual->class >= 0 && visual->class < NUM_CLASS_NAMES) {
+       AddDefQ(defs, "CLASS", ClassNames[visual->class]);
+       snprintf(name, sizeof(name), "CLASS_%s", ClassNames[visual->class]);
+       AddNum(defs, name, (int)visual->visualid);
+    }
+    else {
+       fprintf(stderr,
+               "%s: unknown visual type %d for default visual id 0x%lx\n",
+               ProgramName, visual->class, visual->visualid);
+    }
     switch(visual->class) {
        case StaticColor:
        case PseudoColor:
@@ -643,9 +652,16 @@ DoScreenDefines(Display *display, int scrno, String *defs)
                break;
        }
        if (j < 0) {
-           snprintf(name, sizeof(name), "CLASS_%s_%d",
-                   ClassNames[vinfos[i].class], vinfos[i].depth);
-           AddNum(defs, name, (int)vinfos[i].visualid);
+           if (vinfos[i].class >= 0 && vinfos[i].class < NUM_CLASS_NAMES) {
+               snprintf(name, sizeof(name), "CLASS_%s_%d",
+                        ClassNames[vinfos[i].class], vinfos[i].depth);
+               AddNum(defs, name, (int)vinfos[i].visualid);
+           }
+           else {
+               fprintf(stderr,
+                       "%s: unknown visual type %d for visual id 0x%lx\n",
+                       ProgramName, vinfos[i].class, vinfos[i].visualid);
+           }
        }
     }
     XFree((char *)vinfos);
-- 
1.7.9.2


-- 
To UNSUBSCRIBE, email to debian-x-requ...@lists.debian.org
with a subject of "unsubscribe". Trouble? Contact listmas...@lists.debian.org
Archive: 
http://lists.debian.org/1373137566-6437-1-git-send-email-alan.coopersm...@oracle.com

Reply via email to