xfree86: Fix NULL pointer dereference crash

screenp->displays[count] (passed to configDisplay() in
configScreen()) is NULL if there is no Virtual setting
in the configuration.

Fixes: f8a6be04d0 ("xfree86: Change
displays array to pointers array to fix invalid pointer issues
after table reallocation")

Signed-off-by: Zoltán Böszörményi <zboszor@gmail.com>
This commit is contained in:
Zoltán Böszörményi 2021-06-21 12:12:41 +02:00
parent aad61e8e03
commit ef89b6648e

View File

@ -1797,24 +1797,21 @@ configScreen(confScreenPtr screenp, XF86ConfScreenPtr conf_screen, int scrnum,
screenp->displays = xnfallocarray(count, sizeof(DispPtr)); screenp->displays = xnfallocarray(count, sizeof(DispPtr));
screenp->numdisplays = count; screenp->numdisplays = count;
/* Fill in the default Virtual size, if any */ for (count = 0, dispptr = conf_screen->scrn_display_lst;
if (conf_screen->scrn_virtualX && conf_screen->scrn_virtualY) { dispptr;
for (count = 0, dispptr = conf_screen->scrn_display_lst; dispptr = (XF86ConfDisplayPtr) dispptr->list.next, count++) {
dispptr;
dispptr = (XF86ConfDisplayPtr) dispptr->list.next, count++) { /* Allocate individual Display records */
screenp->displays[count] = xnfcalloc(1, sizeof(DispRec)); screenp->displays[count] = xnfcalloc(1, sizeof(DispRec));
/* Fill in the default Virtual size, if any */
if (conf_screen->scrn_virtualX && conf_screen->scrn_virtualY) {
screenp->displays[count]->virtualX = conf_screen->scrn_virtualX; screenp->displays[count]->virtualX = conf_screen->scrn_virtualX;
screenp->displays[count]->virtualY = conf_screen->scrn_virtualY; screenp->displays[count]->virtualY = conf_screen->scrn_virtualY;
} }
}
/* Now do the per-Display Virtual sizes */ /* Now do the per-Display Virtual sizes */
count = 0;
dispptr = conf_screen->scrn_display_lst;
while (dispptr) {
configDisplay(screenp->displays[count], dispptr); configDisplay(screenp->displays[count], dispptr);
count++;
dispptr = (XF86ConfDisplayPtr) dispptr->list.next;
} }
/* /*