diff options
author | Johan Hedberg <johan.hedberg@intel.com> | 2011-07-05 12:33:57 +0300 |
---|---|---|
committer | Johan Hedberg <johan.hedberg@intel.com> | 2011-07-16 17:50:47 +0300 |
commit | 150d4f36d48b9b344d3747111360824b01405cfe (patch) | |
tree | 6919306a090a887afe420997e14cf0d8dfbdb430 /gobex/gobex-header.c | |
parent | 9a87089cc971c1e9e618d051cc495a69bebd70f2 (diff) | |
download | obexd-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.c | 14 |
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)); |