[PATCH xserver] glamor: restore vfunc handlers on init failure

Hans de Goede hdegoede at redhat.com
Thu Nov 3 11:04:28 UTC 2016


Hi,

On 03-11-16 09:59, Olivier Fourdan wrote:
> In glamor_init(), if the minimum requirements are not met, glamor may
> fail after setting up its own CloseScreen() and DestroyPixmap()
> routines, leading to a crash when either of the two routines is called
> if glamor failed to complete its initialization, e.g:
>
>   (EE) Backtrace:
>   (EE) 0:  Xwayland (OsSigHandler+0x29)
>   (EE) 1: /lib64/libpthread.so.0 (__restore_rt+0x0)
>   (EE) 2: Xwayland (glamor_sync_close+0x2a)
>   (EE) 3: Xwayland (glamor_close_screen+0x52)
>   (EE) 4: Xwayland (CursorCloseScreen+0x88)
>   (EE) 5: Xwayland (AnimCurCloseScreen+0xa4)
>   (EE) 6: Xwayland (present_close_screen+0x42)
>   (EE) 7: Xwayland (dix_main+0x4f9)
>   (EE) 8: /lib64/libc.so.6 (__libc_start_main+0xf1)
>   (EE) 9:  Xwayland (_start+0x2a)
>
> Restore the previous CloseScreen() and DestroyPixmap() vfunc handlers in
> case of failure when checking for the minimum requirements, so that if
> any of the requirement is not met we don't leave the CloseScreen() and
> DestroyPixmap() from glamor handlers in place.
>
> Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1390018
>
> Signed-off-by: Olivier Fourdan <ofourdan at redhat.com>

Patch looks good to me:

Reviewed-by: Hans de Goede <hdegoede at redhat.com>

Regards,

Hans

> ---
>  glamor/glamor.c | 11 ++++++++---
>  1 file changed, 8 insertions(+), 3 deletions(-)
>
> diff --git a/glamor/glamor.c b/glamor/glamor.c
> index b771832..c54cf3b 100644
> --- a/glamor/glamor.c
> +++ b/glamor/glamor.c
> @@ -470,7 +470,7 @@ glamor_init(ScreenPtr screen, unsigned int flags)
>          LogMessage(X_WARNING,
>                     "glamor%d: Failed to allocate screen private\n",
>                     screen->myNum);
> -        goto fail;
> +        goto free_glamor_private;
>      }
>
>      glamor_set_screen_private(screen, glamor_priv);
> @@ -480,7 +480,7 @@ glamor_init(ScreenPtr screen, unsigned int flags)
>          LogMessage(X_WARNING,
>                     "glamor%d: Failed to allocate pixmap private\n",
>                     screen->myNum);
> -        goto fail;
> +        goto free_glamor_private;
>      }
>
>      if (!dixRegisterPrivateKey(&glamor_gc_private_key, PRIVATE_GC,
> @@ -488,7 +488,7 @@ glamor_init(ScreenPtr screen, unsigned int flags)
>          LogMessage(X_WARNING,
>                     "glamor%d: Failed to allocate gc private\n",
>                     screen->myNum);
> -        goto fail;
> +        goto free_glamor_private;
>      }
>
>      glamor_priv->saved_procs.close_screen = screen->CloseScreen;
> @@ -731,6 +731,11 @@ glamor_init(ScreenPtr screen, unsigned int flags)
>      return TRUE;
>
>   fail:
> +    /* Restore default CloseScreen and DestroyPixmap handlers */
> +    screen->CloseScreen = glamor_priv->saved_procs.close_screen;
> +    screen->DestroyPixmap = glamor_priv->saved_procs.destroy_pixmap;
> +
> + free_glamor_private:
>      free(glamor_priv);
>      glamor_set_screen_private(screen, NULL);
>      return FALSE;
>


More information about the xorg-devel mailing list