Diff between ed13e117c186ddaac6ac1ab1978cebe76e2a0a31 and a7100576de83c5edeb9883861e5185c2e02398bb

Changed Files

File Additions Deletions Status
obexd/src/mimetype.c +22 -5 modified
obexd/src/mimetype.h +3 -1 modified
obexd/src/obex.c +7 -4 modified

Full Patch

diff --git a/obexd/src/mimetype.c b/obexd/src/mimetype.c
index 02a7879..27acf5f 100644
--- a/obexd/src/mimetype.c
+++ b/obexd/src/mimetype.c
@@ -46,6 +46,18 @@ struct io_watch {
 	gpointer user_data;
 };
 
+/* Just thin wrapper around memcmp to deal with NULL values */
+static int memcmp0(const void *a, const void *b, size_t n)
+{
+	if (a == NULL)
+		return -(a != b);
+
+	if (b == NULL)
+		return a != b;
+
+	return memcmp(a, b, n);
+}
+
 void obex_object_set_io_flags(gpointer object, int flags, int err)
 {
 	GSList *l;
@@ -117,15 +129,18 @@ static int set_io_watch(gpointer object, obex_object_io_func func,
 	return 0;
 }
 
-struct obex_mime_type_driver *obex_mime_type_driver_find(const guint8 *target, const char *mimetype)
+struct obex_mime_type_driver *obex_mime_type_driver_find(const guint8 *target,
+		const char *mimetype, const guint8 *who, guint who_size)
 {
 	GSList *l;
 
 	for (l = drivers; l; l = l->next) {
 		struct obex_mime_type_driver *driver = l->data;
 
-		if (driver->target && target &&
-				memcmp(target, driver->target, TARGET_SIZE))
+		if (memcmp0(target, driver->target, TARGET_SIZE))
+			continue;
+
+		if (memcmp0(who, driver->who, who_size))
 			continue;
 
 		if (g_strcmp0(mimetype, driver->mimetype) == 0)
@@ -142,8 +157,10 @@ int obex_mime_type_driver_register(struct obex_mime_type_driver *driver)
 		return -EINVAL;
 	}
 
-	if (obex_mime_type_driver_find(driver->target, driver->mimetype)) {
-		error("Permission denied: %s could not be registered", driver->mimetype);
+	if (obex_mime_type_driver_find(driver->target, driver->mimetype,
+					driver->who, driver->who_size)) {
+		error("Permission denied: %s could not be registered",
+				driver->mimetype);
 		return -EPERM;
 	}
 
diff --git a/obexd/src/mimetype.h b/obexd/src/mimetype.h
index fc1fcb8..dc16240 100644
--- a/obexd/src/mimetype.h
+++ b/obexd/src/mimetype.h
@@ -27,6 +27,8 @@ typedef gboolean (*obex_object_io_func) (gpointer object, int flags, int err,
 struct obex_mime_type_driver {
 	const guint8 *target;
 	const char *mimetype;
+	const guint8 *who;
+	guint who_size;
 	gpointer driver_data;
 	gpointer (*open) (const char *name, int oflag, mode_t mode,
 			gpointer driver_data, size_t *size, int *err);
@@ -41,6 +43,6 @@ struct obex_mime_type_driver {
 int obex_mime_type_driver_register(struct obex_mime_type_driver *driver);
 void obex_mime_type_driver_unregister(struct obex_mime_type_driver *driver);
 struct obex_mime_type_driver *obex_mime_type_driver_find(const guint8 *target,
-							const char *mimetype);
+		const char *mimetype, const guint8 *who, guint who_size);
 
 void obex_object_set_io_flags(gpointer object, int flags, int err);
diff --git a/obexd/src/obex.c b/obexd/src/obex.c
index aafcb44..9fc7d37 100644
--- a/obexd/src/obex.c
+++ b/obexd/src/obex.c
@@ -366,13 +366,14 @@ static void cmd_get(struct obex_session *os, obex_t *obex, obex_object_t *obj)
 
 			os->type = g_strndup((const gchar *) hd.bs, hlen);
 			debug("OBEX_HDR_TYPE: %s", os->type);
-			os->driver = obex_mime_type_driver_find(os->service->target, os->type);
+			os->driver = obex_mime_type_driver_find(os->service->target,
+					os->type, os->service->who, os->service->who_size);
 			break;
 		}
 	}
 
 	if (!os->driver) {
-		os->driver = obex_mime_type_driver_find(os->service->target, NULL);
+		os->driver = obex_mime_type_driver_find(os->service->target, NULL, NULL, 0);
 		if (!os->driver) {
 			error("No driver found");
 			OBEX_ObjectSetRsp(obj, OBEX_RSP_NOT_IMPLEMENTED,
@@ -730,7 +731,8 @@ static gboolean check_put(obex_t *obex, obex_object_t *obj)
 
 			os->type = g_strndup((const gchar *) hd.bs, hlen);
 			debug("OBEX_HDR_TYPE: %s", os->type);
-			os->driver = obex_mime_type_driver_find(os->service->target, os->type);
+			os->driver = obex_mime_type_driver_find(os->service->target,
+					os->type, os->service->who, os->service->who_size);
 			break;
 
 		case OBEX_HDR_BODY:
@@ -751,7 +753,8 @@ static gboolean check_put(obex_t *obex, obex_object_t *obj)
 	OBEX_ObjectReParseHeaders(obex, obj);
 
 	if (!os->driver) {
-		os->driver = obex_mime_type_driver_find(os->service->target, NULL);
+		os->driver = obex_mime_type_driver_find(os->service->target,
+				NULL, NULL, 0);
 		if (!os->driver) {
 			error("No driver found");
 			OBEX_ObjectSetRsp(obj, OBEX_RSP_NOT_IMPLEMENTED,