atspi: sanitize service name before creating bus 18/68418/2
authorLukasz Stanislawski <l.stanislaws@samsung.com>
Mon, 22 Jun 2015 08:15:31 +0000 (10:15 +0200)
committerShinwoo Kim <cinoo.kim@samsung.com>
Wed, 4 May 2016 10:00:59 +0000 (03:00 -0700)
Path fixes crashes when service name contained chracters forbbiden by
dbus daemon.

Change-Id: Ib0cbf570c90a377bcfd7f71eabd40d4ba46e2bf4

src/lib/elm_atspi_bridge.c

index 0b642092cd24c99cec6dd36cf98e464260808ac4..2d7fc9dcbeafc3e85293530c7d57c91cf4c443e3 100644 (file)
@@ -5036,6 +5036,11 @@ _plug_address_discover(Eldbus_Connection *conn, Eo *proxy, const char *svc_bus,
 {
    Eldbus_Object *dobj;
    dobj = eldbus_object_get(conn, svc_bus, svc_path);
+   if (!dobj)
+     {
+        ERR("Unable to get eldbus object from: %s %s", svc_bus, svc_path);
+        return;
+     }
 
    Eldbus_Message *msg = eldbus_object_method_call_new(dobj, ELDBUS_FDO_INTERFACE_PROPERTIES, "Get");
    eldbus_message_arguments_append(msg, "ss", ELM_ATSPI_DBUS_INTERFACE_PROXY, "Object");
@@ -5099,17 +5104,63 @@ EAPI void elm_atspi_bridge_utils_proxy_connect(Eo *proxy)
    _plug_connect(pd->a11y_bus, proxy);
 }
 
+/**
+ * @brief Service name sanitizer according to specs:
+ * http://dbus.freedesktop.org/doc/dbus-specification.html#message-protocol-names
+ * http://dbus.freedesktop.org/doc/dbus-specification.html#message-protocol-marshaling-object-path
+ */
+char *_sanitize_service_name(const char *name)
+{
+   char ret[256] = "\0";
+
+   if (!name) return NULL;
+
+   const char *tmp = name;
+   char *dst = ret;
+
+   // name element should not begin with digit. Swallow non-charater prefix
+   while ((*tmp != '\0') && !isalpha(*tmp)) tmp++;
+
+   // append rest of character valid charactes [A-Z][a-z][0-9]_
+   while ((*tmp != '\0') && (dst < &ret[sizeof(ret) - 1]))
+     {
+        if (isalpha(*tmp) || isdigit(*tmp) || (*tmp == '_'))
+          *dst++ = *tmp;
+        tmp++;
+     }
+
+   *++dst = '\0';
+   return strdup(ret);
+}
+
 Eo* _elm_atspi_bridge_utils_proxy_create(Eo *parent, const char *svcname, int svcnum, Elm_Atspi_Proxy_Type type)
 {
    Eo *ret;
-   char bus[64], path[64];
+   char bus[256], path[256], *name;
+   int res;
+
+   name = _sanitize_service_name(svcname);
+   if (!name) return NULL;
+
+   res = snprintf(bus, sizeof(bus), "elm.atspi.proxy.socket.%s-%d", name, svcnum);
+   if (res < 0 || (res >= (int)sizeof(bus)))
+     {
+        free(name);
+        return NULL;
+     }
+
+   res = snprintf(path, sizeof(path), "/elm/atspi/proxy/socket/%s/%d", name, svcnum);
+   if (res < 0 || (res >= (int)sizeof(path)))
+     {
+        free(name);
+        return NULL;
+     }
+
+   free(name);
 
    ret = eo_add(ELM_ATSPI_PROXY_CLASS, parent, elm_obj_atspi_proxy_constructor(type));
    if (!ret) return NULL;
 
-   snprintf(bus, sizeof(bus), "elm.atspi.proxy.socket.%s-%d", svcname, svcnum);
-   snprintf(path, sizeof(path), "/elm/atspi/proxy/socket/%s/%d", svcname, svcnum);
-
    eo_do(ret, eo_key_data_set("__svc_bus", eina_stringshare_add(bus)));
    eo_do(ret, eo_key_data_set("__svc_path", eina_stringshare_add(path)));