[patch] xserver: fix deadloop when preferred mode > 1

Alex Deucher alexdeucher at gmail.com
Fri Sep 28 06:18:58 PDT 2007


On 9/28/07, Hong Liu <hong.liu at intel.com> wrote:
> When preferred mode option is enabled and there are more than 1 mode
> matches the preferred mode, X will get in dead-loop.
>

Keithp and I discussed this last weekend and I came up with a similar
patch (http://www.botchco.com/alex/xorg/fix_crtc_loop.diff)
However, the question is, if we have multiple modes with the same
name, which one does the user want?  The first one we find?  Do we
care?  Yeah for non-unique strings.

Alex

> Thanks,
> Hong
>
> diff --git a/hw/xfree86/modes/xf86Crtc.c b/hw/xfree86/modes/xf86Crtc.c
> index 064ff16..78479bb 100644
> --- a/hw/xfree86/modes/xf86Crtc.c
> +++ b/hw/xfree86/modes/xf86Crtc.c
> @@ -1400,25 +1400,33 @@ xf86ProbeOutputModes (ScrnInfoPtr scrn, int maxX, int maxY)
>
>         if (preferred_mode)
>         {
> -           for (mode = output->probed_modes; mode; mode = mode->next)
> +           mode = output->probed_modes;
> +           while (mode)
>             {
> +               DisplayModePtr next;
> +
>                 if (!strcmp (preferred_mode, mode->name))
>                 {
> +                   next = mode->next;
>                     if (mode != output->probed_modes)
>                     {
>                         if (mode->prev)
> -                           mode->prev->next = mode->next;
> -                       if (mode->next)
> -                           mode->next->prev = mode->prev;
> +                           mode->prev->next = next;
> +                       if (next)
> +                           next->prev = mode->prev;
>                         mode->next = output->probed_modes;
>                         output->probed_modes->prev = mode;
>                         mode->prev = NULL;
>                         output->probed_modes = mode;
>                     }
>                     mode->type |= M_T_PREFERRED;
> +                   mode = next;
> +                   continue;
>                 }
>                 else
>                     mode->type &= ~M_T_PREFERRED;
> +
> +               mode = mode->next;
>             }
>         }
>
> _______________________________________________
> xorg mailing list
> xorg at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/xorg
>



More information about the xorg mailing list