aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorAleksander Morgado <aleksander@lanedo.com>2013-04-02 13:31:31 +0200
committerAleksander Morgado <aleksander@lanedo.com>2013-04-02 17:04:01 +0200
commit678f596ff996dd483d00f026cd21e120fbde698b (patch)
treec2fb1b1bd1621e6a22617b599f244174da0411b7 /src
parentfc219be4d46aefe644cc17b6a0976be5c1a732b8 (diff)
qcdm-serial-port: avoid playing with GByteArray internals
Since glib 2.32, we can use g_byte_array_new_take() to build a new GByteArray from an own allocated buffer, so skip playing with the GByteArray internals.
Diffstat (limited to 'src')
-rw-r--r--src/mm-qcdm-serial-port.c17
1 files changed, 10 insertions, 7 deletions
diff --git a/src/mm-qcdm-serial-port.c b/src/mm-qcdm-serial-port.c
index 44a5f1c3..bce80519 100644
--- a/src/mm-qcdm-serial-port.c
+++ b/src/mm-qcdm-serial-port.c
@@ -81,6 +81,7 @@ handle_response (MMSerialPort *port,
{
MMQcdmSerialResponseFn response_callback = (MMQcdmSerialResponseFn) callback;
GByteArray *unescaped = NULL;
+ guint8 *unescaped_buffer;
GError *dm_error = NULL;
gsize used = 0;
gsize start = 0;
@@ -101,11 +102,10 @@ handle_response (MMSerialPort *port,
goto callback;
}
- /* FIXME: don't munge around with byte array internals */
- unescaped = g_byte_array_sized_new (1024);
+ unescaped_buffer = g_malloc (1024);
success = dm_decapsulate_buffer ((const char *) (response->data + start),
response->len - start,
- (char *) unescaped->data,
+ (char *) unescaped_buffer,
1024,
&unescaped_len,
&used,
@@ -114,16 +114,19 @@ handle_response (MMSerialPort *port,
g_set_error_literal (&dm_error,
MM_CORE_ERROR, MM_CORE_ERROR_FAILED,
"Failed to unescape QCDM packet.");
- g_byte_array_free (unescaped, TRUE);
- unescaped = NULL;
+ g_free (unescaped_buffer);
+ unescaped_buffer = NULL;
} else if (more) {
/* Need more data; we shouldn't have gotten here since the parse
* function checks for the end-of-frame marker, but whatever.
*/
+ g_free (unescaped_buffer);
return 0;
} else {
/* Successfully decapsulated the DM command */
- unescaped->len = (guint) unescaped_len;
+ g_assert (unescaped_len <= 1024);
+ unescaped_buffer = g_realloc (unescaped_buffer, unescaped_len);
+ unescaped = g_byte_array_new_take (unescaped_buffer, unescaped_len);
}
callback:
@@ -133,7 +136,7 @@ callback:
callback_data);
if (unescaped)
- g_byte_array_free (unescaped, TRUE);
+ g_byte_array_unref (unescaped);
g_clear_error (&dm_error);
return start + used;