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.
(type == ECORE_CON_LOCAL_SYSTEM))
{
char *path = ecore_con_local_path_new(type == ECORE_CON_LOCAL_SYSTEM, svr->name, svr->port);
+ struct stat st;
+
if (!path)
{
ERR("could not create local path for name='%s', port=%d", svr->name, svr->port);
eina_strlcpy(address, path, sizeof(address));
free(path);
}
+
+ if ((stat(address, &st) != 0)
+#ifdef S_ISSOCK
+ || (!S_ISSOCK(st.st_mode))
+#endif
+ )
+ {
+ DBG("%s is not a socket", address);
+ return EINA_FALSE;
+ }
}
if ((svr->type & ECORE_CON_NO_PROXY) == ECORE_CON_NO_PROXY)
#include <string.h>
#include <sys/types.h>
+#include <sys/stat.h>
#ifdef HAVE_ARPA_INET_H
# include <arpa/inet.h>
#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);
}