From ae054e6c0bb5cab6ca126c152057e5243ab31dfa Mon Sep 17 00:00:00 2001 From: Gustavo Sverzut Barbieri Date: Mon, 19 Dec 2016 11:58:55 -0200 Subject: ecore_con/ecore_ipc legacy: fail early for local sockets. In the old/legacy API the socket would be opened early in non-blocking mode (connect returned errno==EINPROGRESS), with UNIX socket being path-validated early and returning NULL as 'server' handle. Some applications relied on this instead of monitoring the "ERROR" events, considering the connection to be successful if there was a handle -- this was the case with Terminology after it moved from DBus to Ecore_Ipc. Although this is not correct, we must keep compatibility and thus we stat() in compatibility layer, failing early as the old API would do. --- src/lib/ecore_ipc/ecore_ipc.c | 13 +++++++++++++ 1 file changed, 13 insertions(+) (limited to 'src/lib/ecore_ipc') diff --git a/src/lib/ecore_ipc/ecore_ipc.c b/src/lib/ecore_ipc/ecore_ipc.c index dfacf933bc..40a1e1e8a7 100644 --- a/src/lib/ecore_ipc/ecore_ipc.c +++ b/src/lib/ecore_ipc/ecore_ipc.c @@ -4,6 +4,7 @@ #include #include +#include #ifdef HAVE_ARPA_INET_H # include @@ -761,9 +762,21 @@ ecore_ipc_server_connect(Ecore_Ipc_Type type, char *name, int port, const void * #ifdef EFL_NET_DIALER_UNIX_CLASS if ((type & ECORE_IPC_TYPE) == ECORE_IPC_LOCAL_USER) { + struct stat st; + address = ecore_con_local_path_new(EINA_FALSE, name, port); EINA_SAFETY_ON_NULL_GOTO(address, error_dialer); + if ((stat(address, &st) != 0) +#ifdef S_ISSOCK + || (!S_ISSOCK(st.st_mode)) +#endif + ) + { + DBG("%s is not a socket", address); + goto error_dialer; + } + svr->dialer.dialer = efl_add(EFL_NET_DIALER_UNIX_CLASS, ecore_main_loop_get()); EINA_SAFETY_ON_NULL_GOTO(svr->dialer.dialer, error_dialer); } -- cgit v1.2.1