summaryrefslogtreecommitdiff
path: root/gobex/gobex-header.c
diff options
context:
space:
mode:
authorJohan Hedberg <johan.hedberg@intel.com>2011-07-05 12:33:57 +0300
committerMarcel Holtmann <marcel@holtmann.org>2012-12-04 22:21:59 +0100
commit714abdfc725dfb94e049e25674437541b9770c98 (patch)
tree39baba110d8de090a76dcf997b8b1eb36a246c19 /gobex/gobex-header.c
parent2e49852cceb9fa6e1f72f01f488184635a940564 (diff)
downloadbluez-714abdfc725dfb94e049e25674437541b9770c98.tar.gz
gobex: Make on-demand header callbacks able to fail cleanly
Diffstat (limited to 'gobex/gobex-header.c')
-rw-r--r--gobex/gobex-header.c14
1 files changed, 9 insertions, 5 deletions
diff --git a/gobex/gobex-header.c b/gobex/gobex-header.c
index 6d0136cd5..3446bb9e7 100644
--- a/gobex/gobex-header.c
+++ b/gobex/gobex-header.c
@@ -83,13 +83,17 @@ static const guint8 *get_bytes(void *to, const guint8 *from, gsize count)
return (from + count);
}
-static gsize get_data(GObexHeader *header, guint8 *buf, gsize len)
+static gssize get_data(GObexHeader *header, guint8 *buf, gsize len)
{
guint16 u16;
+ gssize ret;
- header->vlen = header->get_data(header, buf + 2, len - 2,
+ ret = header->get_data(header, buf + 2, len - 2,
header->get_data_data);
+ if (ret < 0)
+ return ret;
+ header->vlen = ret;
header->hlen = header->vlen + 3;
u16 = g_htons(header->hlen);
memcpy(buf, &u16, sizeof(u16));
@@ -97,7 +101,7 @@ static gsize get_data(GObexHeader *header, guint8 *buf, gsize len)
return header->hlen;
}
-gsize g_obex_header_encode(GObexHeader *header, void *buf, gsize buf_len)
+gssize g_obex_header_encode(GObexHeader *header, void *buf, gsize buf_len)
{
guint8 *ptr = buf;
guint16 u16;
@@ -106,7 +110,7 @@ gsize g_obex_header_encode(GObexHeader *header, void *buf, gsize buf_len)
glong utf16_len;
if (buf_len < header->hlen)
- return 0;
+ return -1;
ptr = put_bytes(ptr, &header->id, sizeof(header->id));
@@ -114,7 +118,7 @@ gsize g_obex_header_encode(GObexHeader *header, void *buf, gsize buf_len)
case G_OBEX_HDR_TYPE_UNICODE:
utf16_len = utf8_to_utf16(&utf16, header->v.string);
if (utf16_len < 0 || (guint16) utf16_len > buf_len)
- return 0;
+ return -1;
g_assert_cmpuint(utf16_len + 3, ==, header->hlen);
u16 = g_htons(utf16_len + 3);
ptr = put_bytes(ptr, &u16, sizeof(u16));