diff options
author | Johan Hedberg <johan.hedberg@intel.com> | 2011-07-05 12:33:57 +0300 |
---|---|---|
committer | Marcel Holtmann <marcel@holtmann.org> | 2012-12-04 22:21:59 +0100 |
commit | 714abdfc725dfb94e049e25674437541b9770c98 (patch) | |
tree | 39baba110d8de090a76dcf997b8b1eb36a246c19 /gobex/gobex-header.c | |
parent | 2e49852cceb9fa6e1f72f01f488184635a940564 (diff) | |
download | bluez-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.c | 14 |
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)); |