_plug_connect(pd->a11y_bus, proxy);
}
-//TIZEN_ONLY(20180810) atspi: check service, bus and path names for Dbus communication
+//TIZEN_ONLY(20200320) atspi: sanitize service, bus and path names for Dbus communication
/**
* @brief In according to following specification:
* http://dbus.freedesktop.org/doc/dbus-specification.html#message-protocol-names
* http://dbus.freedesktop.org/doc/dbus-specification.html#message-protocol-marshaling-object-path
+ * We prepare service name to not contain any irregular characters such as @.
+ * The function below perform preliminary service name sanitization,
+ * then _sanitize_bus_name() and _sanitize_path_name() are performed accordingly.
*/
-static Eina_Bool _check_service_name(const char *str)
+static char *_sanitize_service_name(const char *str)
{
- if (!str)
- return EINA_FALSE;
+ char *res = eina_strdup(str);
+ if(!res)
+ return NULL;
- char *tmp = (char *)str;
+ char *tmp = res;
while (*tmp)
{
if (!isalnum(*tmp) && *tmp != '_' && *tmp != '-' && *tmp != '.')
{
- ERR("Invalid service name: %s, following character is forbidden in Dbus specification: %c", str, *tmp);
- return EINA_FALSE;
+ *tmp = '_';
}
++tmp;
}
- return EINA_TRUE;
+ return res;
}
static char *_sanitize_bus_name(const char *str)
{
- char *res = strdup(str);
+ char *res = eina_strdup(str);
if(!res)
return NULL;
char *tmp = res;
static char *_sanitize_path_name(const char *str)
{
- char *res = strdup(str);
+ char *res = eina_strdup(str);
if(!res)
return NULL;
char *tmp = res;
return res;
}
-//
Eo* _elm_atspi_bridge_utils_proxy_create(Eo *parent, const char *svcname, int svcnum, Elm_Atspi_Proxy_Type type)
{
Eo *ret;
- //TIZEN_ONLY(20180810) atspi: check service, bus and path names for Dbus communication
+
char bus[256], path[256];
int res;
- Eina_Bool c = _check_service_name(svcname);
- if (!c) return NULL;
+ char *svc_sanitized = _sanitize_service_name(svcname);
+ if (!svc_sanitized)
+ {
+ return NULL;
+ }
- res = snprintf(bus, sizeof(bus), "elm.atspi.proxy.socket-%s-%d", svcname, svcnum);
+ res = snprintf(bus, sizeof(bus), "elm.atspi.proxy.socket-%s-%d", svc_sanitized, svcnum);
if (res < 0 || (res >= (int)sizeof(bus)))
{
ERR("Error occured during creating bus name");
+ free(svc_sanitized);
return NULL;
}
- res = snprintf(path, sizeof(path), "/elm/atspi/proxy/socket/%s/%d", svcname, svcnum);
+ res = snprintf(path, sizeof(path), "/elm/atspi/proxy/socket/%s/%d", svc_sanitized, svcnum);
if (res < 0 || (res >= (int)sizeof(path)))
{
ERR("Error occured during creating bus name");
+ free(svc_sanitized);
return NULL;
}
ret = efl_add(ELM_ATSPI_PROXY_CLASS, parent, elm_obj_atspi_proxy_ctor(efl_added, type));
- if (!ret) return NULL;
+ if (!ret)
+ {
+ free(svc_sanitized);
+ return NULL;
+ }
char *bus_sanitized = _sanitize_bus_name(bus);
char *path_sanitized = _sanitize_path_name(path);
if(!bus_sanitized || !path_sanitized)
{
+ free(svc_sanitized);
free(bus_sanitized);
free(path_sanitized);
return NULL;
_bridge_object_register(_instance, ret);
_bridge_object_register(_instance, parent);
}
- //
efl_key_data_set(ret, "__svc_bus", eina_stringshare_add(bus_sanitized));
efl_key_data_set(ret, "__svc_path", eina_stringshare_add(path_sanitized));
+ free(svc_sanitized);
free(bus_sanitized);
free(path_sanitized);
return ret;
}
+//
static void
_on_socket_del(void *data, const Efl_Event *event)