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
committerJohan Hedberg <johan.hedberg@intel.com>2011-07-16 17:50:47 +0300
commit150d4f36d48b9b344d3747111360824b01405cfe (patch)
tree6919306a090a887afe420997e14cf0d8dfbdb430 /gobex/gobex-header.c
parent9a87089cc971c1e9e618d051cc495a69bebd70f2 (diff)
downloadobexd-150d4f36d48b9b344d3747111360824b01405cfe.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 6d0136c..3446bb9 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));