summaryrefslogtreecommitdiff
path: root/gobex/gobex-header.c
diff options
context:
space:
mode:
authorJohan Hedberg <johan.hedberg@intel.com>2011-06-29 13:15:05 +0300
committerMarcel Holtmann <marcel@holtmann.org>2012-12-04 22:21:57 +0100
commitaa1b87b6d8a8d51632ab31b637d85183944ac3a8 (patch)
tree51e699f03570ee70edd7c7f1b636134a25a62d4d /gobex/gobex-header.c
parent31ebc74e69a833122cdc1c25078e614c7d7895bb (diff)
downloadbluez-aa1b87b6d8a8d51632ab31b637d85183944ac3a8.tar.gz
gobex: Add initial GError support
Diffstat (limited to 'gobex/gobex-header.c')
-rw-r--r--gobex/gobex-header.c46
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));