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
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;
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)
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
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);
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
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,
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:
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,