Diff between b568973ba3d9392430fa5dbf4e1c23dbb5120947 and a1824acc4d83d90bf4fd3c7d1f2474ea1a98f40f

Changed Files

File Additions Deletions Status
gobex/gobex.c +30 -14 modified
gobex/gobex.h +2 -1 modified

Full Patch

diff --git a/gobex/gobex.c b/gobex/gobex.c
index b7a825d..3874f1b 100644
--- a/gobex/gobex.c
+++ b/gobex/gobex.c
@@ -368,6 +368,30 @@ gboolean g_obex_packet_add_header(GObexPacket *pkt, GObexHeader *header)
 	return TRUE;
 }
 
+gboolean g_obex_packet_set_data(GObexPacket *pkt, const void *data, size_t len,
+						GObexDataPolicy data_policy)
+{
+	if (pkt->data.buf || pkt->data.buf_ref)
+		return FALSE;
+
+	pkt->data_policy = data_policy;
+	pkt->data_len = len;
+
+	switch (data_policy) {
+	case G_OBEX_DATA_COPY:
+		pkt->data.buf = g_memdup(data, len);
+		break;
+	case G_OBEX_DATA_REF:
+		pkt->data.buf_ref = data;
+		break;
+	case G_OBEX_DATA_INHERIT:
+		pkt->data.buf = (void *) data;
+		break;
+	}
+
+	return TRUE;
+}
+
 GObexPacket *g_obex_packet_new(guint8 opcode)
 {
 	GObexPacket *pkt;
@@ -462,27 +486,19 @@ GObexPacket *g_obex_packet_decode(const void *data, size_t len,
 
 	pkt = g_obex_packet_new(opcode);
 
-	pkt->data_policy = data_policy;
-
 	if (header_offset == 0)
 		goto headers;
 
 	if (3 + header_offset < (ssize_t) len)
 		goto failed;
 
-	pkt->data_len = header_offset;
-	switch (data_policy) {
-	case G_OBEX_DATA_COPY:
-		pkt->data.buf = g_malloc(header_offset);
-		buf = get_bytes(pkt->data.buf, buf, header_offset);
-		break;
-	case G_OBEX_DATA_REF:
-		pkt->data.buf_ref = buf;
-		buf += header_offset;
-		break;
-	default:
+	if (data_policy == G_OBEX_DATA_INHERIT)
 		goto failed;
-	}
+
+	if (!g_obex_packet_set_data(pkt, buf, header_offset, data_policy))
+		goto failed;
+
+	buf += header_offset;
 
 headers:
 	if (!parse_headers(pkt, buf, len - (buf - (guint8 *) data),
diff --git a/gobex/gobex.h b/gobex/gobex.h
index 2b52ef2..7b736ca 100644
--- a/gobex/gobex.h
+++ b/gobex/gobex.h
@@ -84,7 +84,8 @@ GObexHeader *g_obex_header_decode(const void *data, size_t len,
 void g_obex_header_free(GObexHeader *header);
 
 gboolean g_obex_packet_add_header(GObexPacket *req, GObexHeader *header);
-
+gboolean g_obex_packet_set_data(GObexPacket *pkt, const void *data, size_t len,
+						GObexDataPolicy data_policy);
 GObexPacket *g_obex_packet_new(guint8 opcode);
 void g_obex_packet_free(GObexPacket *req);