diff options
author | Pekka Paalanen <pekka.paalanen@collabora.co.uk> | 2017-08-29 17:04:12 +0300 |
---|---|---|
committer | Pekka Paalanen <pekka.paalanen@collabora.co.uk> | 2017-10-04 16:18:06 +0300 |
commit | d7e351189e160470fc51900eabcdec0943291da1 (patch) | |
tree | eb6ad5c91374ac8bcc42ee3ec768fac082303d5c /libweston | |
parent | ae6d35db140afc303753972447e0125465997fe7 (diff) |
libweston: ensure backend is not loaded twice
Check and ensure that a compositor can only load one backend
successfully. If a backend fails to load, it is theoretically possible
to try another backend. Once loading succeeds, only destroying the
compositor would allow "unloading" a backend.
If backend init fail, ensure the backend pointer remains NULL to avoid
calling into a half-loaded backend on e.g. compositor destruction.
Signed-off-by: Pekka Paalanen <pekka.paalanen@collabora.co.uk>
Reviewed-by: Ian Ray <ian.ray@ge.com>
Acked-by Daniel Stone <daniels@collabora.com>
Diffstat (limited to 'libweston')
-rw-r--r-- | libweston/compositor.c | 12 |
1 files changed, 11 insertions, 1 deletions
diff --git a/libweston/compositor.c b/libweston/compositor.c index 53bbf55d..71a9b38c 100644 --- a/libweston/compositor.c +++ b/libweston/compositor.c @@ -5653,6 +5653,11 @@ weston_compositor_load_backend(struct weston_compositor *compositor, int (*backend_init)(struct weston_compositor *c, struct weston_backend_config *config_base); + if (compositor->backend) { + weston_log("Error: attempt to load a backend when one is already loaded\n"); + return -1; + } + if (backend >= ARRAY_LENGTH(backend_map)) return -1; @@ -5660,7 +5665,12 @@ weston_compositor_load_backend(struct weston_compositor *compositor, if (!backend_init) return -1; - return backend_init(compositor, config_base); + if (backend_init(compositor, config_base) < 0) { + compositor->backend = NULL; + return -1; + } + + return 0; } WL_EXPORT int |