ecore_wl: abort if wl_display_dispatch returns negative value

Summary:
If the connection between server and client has problems, wl_display_dispatch
an return negative value. i.e. when enlightenment has been killed accidently.
In this case, app can enter into infinite loop.

Signed-off-by: Boram Park <boram1288.park@samsung.com>

Reviewers: stefan_schmidt, zmike, gwanglim, raster, devilhorns

Subscribers: cedric

Differential Revision: https://phab.enlightenment.org/D3077
This commit is contained in:
Boram Park 2015-09-23 09:22:29 -04:00 committed by Chris Michael
parent f823d9c2cc
commit 3ebdfd8779
1 changed files with 32 additions and 3 deletions

View File

@ -121,8 +121,18 @@ _ecore_wl_init_callback(void *data, struct wl_callback *callback, uint32_t seria
static void
_ecore_wl_init_wait(void)
{
int ret;
while (!_ecore_wl_disp->init_done)
wl_display_dispatch(_ecore_wl_disp->wl.display);
{
ret = wl_display_dispatch(_ecore_wl_disp->wl.display);
if ((ret < 0) && ((errno != EAGAIN) && (errno != EINVAL)))
{
/* raise exit signal */
ERR("Wayland socket error: %s", strerror(errno));
abort();
break;
}
}
}
EAPI int
@ -262,10 +272,20 @@ ecore_wl_flush(void)
EAPI void
ecore_wl_sync(void)
{
int ret;
if ((!_ecore_wl_disp) || (!_ecore_wl_disp->wl.display)) return;
_ecore_wl_sync_wait(_ecore_wl_disp);
while (_ecore_wl_disp->sync_ref_count > 0)
wl_display_dispatch(_ecore_wl_disp->wl.display);
{
ret = wl_display_dispatch(_ecore_wl_disp->wl.display);
if ((ret < 0) && ((errno != EAGAIN) && (errno != EINVAL)))
{
/* raise exit signal */
ERR("Wayland socket error: %s", strerror(errno));
abort();
break;
}
}
}
EAPI struct wl_shm *
@ -407,9 +427,18 @@ ecore_wl_dpi_get(void)
EAPI void
ecore_wl_display_iterate(void)
{
int ret;
if ((!_ecore_wl_disp) || (!_ecore_wl_disp->wl.display)) return;
if (!_ecore_wl_server_mode)
wl_display_dispatch(_ecore_wl_disp->wl.display);
{
ret = wl_display_dispatch(_ecore_wl_disp->wl.display);
if ((ret < 0) && ((errno != EAGAIN) && (errno != EINVAL)))
{
/* raise exit signal */
ERR("Wayland socket error: %s", strerror(errno));
abort();
}
}
}
/* @since 1.8 */