From 38c2f10f771d0d9286e9284215d8e0aa58a8edb1 Mon Sep 17 00:00:00 2001 From: Luiz Augusto von Dentz Date: Fri, 14 May 2010 11:00:19 +0300 Subject: [PATCH] obexd: Fix regression on opp put when name is not set OBEX specification 1.3 says: "Though the Name header is very useful for operations like file transfer, it is optional" To fix this the drivers .chkput can now return -EBADR which will be translated to bad request, so in case of opp if the auto answer is not active it will let the agent to set a proper name to the object. --- obexd/plugins/ftp.c | 3 +++ obexd/plugins/opp.c | 4 ++++ obexd/src/obex.c | 10 ++++------ 3 files changed, 11 insertions(+), 6 deletions(-) diff --git a/obexd/plugins/ftp.c b/obexd/plugins/ftp.c index bcd6951b2..ffb00fff5 100644 --- a/obexd/plugins/ftp.c +++ b/obexd/plugins/ftp.c @@ -237,6 +237,9 @@ static gint ftp_chkput(struct obex_session *os, gpointer user_data) gchar *path; int ret; + if (name == NULL) + return -EBADR; + if (obex_get_size(os) == OBJECT_SIZE_DELETE) return 0; diff --git a/obexd/plugins/opp.c b/obexd/plugins/opp.c index 7637516e4..729c2ef16 100644 --- a/obexd/plugins/opp.c +++ b/obexd/plugins/opp.c @@ -27,6 +27,7 @@ #endif #include +#include #include #include @@ -136,6 +137,9 @@ static gint opp_chkput(struct obex_session *os, gpointer user_data) name = g_strdup(obex_get_name(os)); skip_auth: + if (name == NULL || strlen(name) == 0) + return -EBADR; + path = g_build_filename(folder, name, NULL); manager_emit_transfer_started(os); diff --git a/obexd/src/obex.c b/obexd/src/obex.c index 71fef28a4..e4872c1d5 100644 --- a/obexd/src/obex.c +++ b/obexd/src/obex.c @@ -799,12 +799,6 @@ static gboolean check_put(obex_t *obex, obex_object_t *obj) if (!os->service->chkput) goto done; - if (!os->name) { - OBEX_ObjectSetRsp(obj, OBEX_RSP_BAD_REQUEST, - OBEX_RSP_BAD_REQUEST); - return FALSE; - } - ret = os->service->chkput(os, os->service_data); switch (ret) { case 0: @@ -812,6 +806,10 @@ static gboolean check_put(obex_t *obex, obex_object_t *obj) case -EPERM: OBEX_ObjectSetRsp(obj, OBEX_RSP_FORBIDDEN, OBEX_RSP_FORBIDDEN); return FALSE; + case -EBADR: + OBEX_ObjectSetRsp(obj, OBEX_RSP_BAD_REQUEST, + OBEX_RSP_BAD_REQUEST); + return FALSE; case -EAGAIN: OBEX_SuspendRequest(obex, obj); os->obj = obj; -- 2.47.3