diff options
author | Johan Hedberg <johan.hedberg@intel.com> | 2011-06-29 13:15:05 +0300 |
---|---|---|
committer | Marcel Holtmann <marcel@holtmann.org> | 2012-12-04 22:21:57 +0100 |
commit | aa1b87b6d8a8d51632ab31b637d85183944ac3a8 (patch) | |
tree | 51e699f03570ee70edd7c7f1b636134a25a62d4d /gobex/gobex-header.c | |
parent | 31ebc74e69a833122cdc1c25078e614c7d7895bb (diff) | |
download | bluez-aa1b87b6d8a8d51632ab31b637d85183944ac3a8.tar.gz |
gobex: Add initial GError support
Diffstat (limited to 'gobex/gobex-header.c')
-rw-r--r-- | gobex/gobex-header.c | 46 |
1 files changed, 38 insertions, 8 deletions
diff --git a/gobex/gobex-header.c b/gobex/gobex-header.c index 949e48a7d..72ea5defd 100644 --- a/gobex/gobex-header.c +++ b/gobex/gobex-header.c @@ -127,15 +127,20 @@ gsize g_obex_header_encode(GObexHeader *header, void *buf, gsize buf_len) } GObexHeader *g_obex_header_decode(const void *data, gsize len, - GObexDataPolicy data_policy, gsize *parsed) + GObexDataPolicy data_policy, gsize *parsed, + GError **err) { GObexHeader *header; const guint8 *ptr = data; guint16 hdr_len; gsize str_len; + GError *conv_err = NULL; - if (len < 2) + if (len < 2) { + g_set_error(err, G_OBEX_ERROR, G_OBEX_ERROR_PARSE_ERROR, + "Too short header in packet"); return NULL; + } header = g_new0(GObexHeader, 1); @@ -147,14 +152,24 @@ GObexHeader *g_obex_header_decode(const void *data, gsize len, goto failed; ptr = get_bytes(&hdr_len, ptr, sizeof(hdr_len)); hdr_len = g_ntohs(hdr_len); - if (hdr_len > len || hdr_len < 5) + if (hdr_len > len || hdr_len < 5) { + g_set_error(err, G_OBEX_ERROR, + G_OBEX_ERROR_PARSE_ERROR, + "Invalid unicode header length"); goto failed; + } header->v.string = g_convert((const char *) ptr, hdr_len - 5, "UTF8", "UTF16BE", - NULL, &str_len, NULL); - if (header->v.string == NULL) + NULL, &str_len, &conv_err); + if (header->v.string == NULL) { + g_set_error(err, G_OBEX_ERROR, + G_OBEX_ERROR_PARSE_ERROR, + "Unicode conversion failed: %s", + conv_err->message); + g_error_free(conv_err); goto failed; + } header->vlen = (gsize) str_len; header->hlen = hdr_len; @@ -163,12 +178,20 @@ GObexHeader *g_obex_header_decode(const void *data, gsize len, break; case G_OBEX_HDR_TYPE_BYTES: - if (len < 3) + if (len < 3) { + g_set_error(err, G_OBEX_ERROR, + G_OBEX_ERROR_PARSE_ERROR, + "Too short byte array header"); goto failed; + } ptr = get_bytes(&hdr_len, ptr, sizeof(hdr_len)); hdr_len = g_ntohs(hdr_len); - if (hdr_len > len) + if (hdr_len > len) { + g_set_error(err, G_OBEX_ERROR, + G_OBEX_ERROR_PARSE_ERROR, + "Too long byte array header"); goto failed; + } header->vlen = hdr_len - 3; header->hlen = hdr_len; @@ -182,6 +205,9 @@ GObexHeader *g_obex_header_decode(const void *data, gsize len, header->v.extdata = ptr; break; default: + g_set_error(err, G_OBEX_ERROR, + G_OBEX_ERROR_INVALID_ARGS, + "Invalid data policy"); goto failed; } @@ -195,8 +221,12 @@ GObexHeader *g_obex_header_decode(const void *data, gsize len, *parsed = 2; break; case G_OBEX_HDR_TYPE_UINT32: - if (len < 5) + if (len < 5) { + g_set_error(err, G_OBEX_ERROR, + G_OBEX_ERROR_PARSE_ERROR, + "Too short uint32 header"); goto failed; + } header->vlen = 4; header->hlen = 5; ptr = get_bytes(&header->v.u32, ptr, sizeof(header->v.u32)); |