From c3452bea97bbdac24bb9d95cdfaf78eb1ce911d3 Mon Sep 17 00:00:00 2001 From: Vinicius Costa Gomes Date: Thu, 18 Sep 2008 12:03:11 -0300 Subject: [PATCH] obexd: Fixes the case when the client doesn't send the Lenght header --- obexd/src/manager.c | 2 +- obexd/src/obex.c | 39 +++++++++++++++++++++++++++++---------- obexd/src/obex.h | 2 +- 3 files changed, 31 insertions(+), 12 deletions(-) diff --git a/obexd/src/manager.c b/obexd/src/manager.c index 8c14061c3..791b3c1a0 100644 --- a/obexd/src/manager.c +++ b/obexd/src/manager.c @@ -278,7 +278,7 @@ static DBusMessage *transfer_cancel(DBusConnection *connection, if (strcmp(agent->bus_name, sender) != 0) return not_authorized(msg); - os->cancelled = TRUE; + os->aborted = TRUE; return dbus_message_new_method_return(msg); } diff --git a/obexd/src/obex.c b/obexd/src/obex.c index 0e8bff0e7..75fbc1adb 100644 --- a/obexd/src/obex.c +++ b/obexd/src/obex.c @@ -81,12 +81,12 @@ struct obex_commands ftp = { .chkput = ftp_chkput, }; -static void os_reset_session(struct obex_session *os, gboolean aborted) +static void os_reset_session(struct obex_session *os) { if (os->fd > 0) { close(os->fd); os->fd = -1; - if (aborted && os->cmd == OBEX_CMD_PUT && os->current_folder) { + if (os->aborted && os->cmd == OBEX_CMD_PUT && os->current_folder) { gchar *path; path = g_build_filename(os->current_folder, os->name, NULL); unlink(path); @@ -105,13 +105,24 @@ static void os_reset_session(struct obex_session *os, gboolean aborted) g_free(os->buf); os->buf = NULL; } + os->aborted = FALSE; os->offset = 0; os->size = OBJECT_SIZE_DELETE; } +static void os_session_mark_aborted(struct obex_session *os) +{ + /* the session was alredy cancelled/aborted */ + if (os->aborted) + return; + + os->aborted = os->size == OBJECT_SIZE_UNKNOWN ? FALSE : + os->size != os->offset; +} + static void obex_session_free(struct obex_session *os) { - os_reset_session(os, os->offset != os->size); + os_reset_session(os); if (os->current_folder) g_free(os->current_folder); @@ -417,7 +428,7 @@ static gint obex_write_stream(struct obex_session *os, os->name ? os->name : "", os->type ? os->type : "", os->tx_mtu, os->fd); - if (os->cancelled) + if (os->aborted) return -EPERM; if (os->fd < 0) { @@ -504,9 +515,13 @@ static gint obex_read_stream(struct obex_session *os, obex_t *obex, gint32 len = 0; const guint8 *buffer; - if (os->cancelled) + if (os->aborted) return -EPERM; + /* workaround: client didn't send the object lenght */ + if (os->size == OBJECT_SIZE_DELETE) + os->size = OBJECT_SIZE_UNKNOWN; + size = OBEX_ObjectReadStream(obex, obj, &buffer); if (size < 0) { error("Error on OBEX stream"); @@ -659,8 +674,10 @@ static gboolean check_put(obex_t *obex, obex_object_t *obj) return FALSE; } - if (os->size == OBJECT_SIZE_DELETE) + if (os->size == OBJECT_SIZE_DELETE || os->size == OBJECT_SIZE_UNKNOWN) { + debug("Got a PUT without a Length"); goto done; + } if (fstatvfs(os->fd, &buf) < 0) { int err = errno; @@ -717,9 +734,11 @@ static void obex_event(obex_t *obex, obex_object_t *obj, gint mode, emit_transfer_progress(os->cid, os->size, os->offset); break; case OBEX_EV_ABORT: + os->aborted = TRUE; if (os->target == NULL) emit_transfer_completed(os->cid, FALSE); - os_reset_session(os, TRUE); + + os_reset_session(os); OBEX_ObjectSetRsp(obj, OBEX_RSP_SUCCESS, OBEX_RSP_SUCCESS); break; case OBEX_EV_REQDONE: @@ -729,10 +748,10 @@ static void obex_event(obex_t *obex, obex_object_t *obj, gint mode, break; case OBEX_CMD_PUT: case OBEX_CMD_GET: + os_session_mark_aborted(os); if (os->target == NULL) - emit_transfer_completed(os->cid, - os->offset == os->size); - os_reset_session(os, os->offset != os->size); + emit_transfer_completed(os->cid, !os->aborted); + os_reset_session(os); break; default: break; diff --git a/obexd/src/obex.h b/obexd/src/obex.h index 006d314f6..a58bd6956 100644 --- a/obexd/src/obex.h +++ b/obexd/src/obex.h @@ -62,7 +62,7 @@ struct obex_session { gint32 offset; gint32 size; gint fd; - gboolean cancelled; + gboolean aborted; const guint8 *target; struct obex_commands *cmds; struct server *server; -- 2.47.3