From e12400dd483d3f93d62f041bdc1656231f147fa2 Mon Sep 17 00:00:00 2001 From: Benjamin Berg Date: Sun, 6 Apr 2014 13:53:10 +0200 Subject: [PATCH] Handle NULL terminated arrays with arbitrary item size. --- gi/pygi-argument.c | 17 ++++++++++++++++- gi/pygi-array.c | 17 ++++++++++++++++- 2 files changed, 32 insertions(+), 2 deletions(-) diff --git a/gi/pygi-argument.c b/gi/pygi-argument.c index 4094c3d..491b13e 100644 --- a/gi/pygi-argument.c +++ b/gi/pygi-argument.c @@ -812,7 +812,22 @@ _pygi_argument_to_array (GIArgument *arg, g_base_info_unref ( (GIBaseInfo *) item_type_info); if (is_zero_terminated) { - length = g_strv_length (arg->v_pointer); + gboolean last; + gint i; + guint8 *data = arg->v_pointer; + + length = 0; + do { + last = TRUE; + for (i = 0; i < item_size; i++) { + if (data[i] != 0) { + length += 1; + data += item_size; + last = FALSE; + break; + } + } + } while (!last); } else { length = g_type_info_get_array_fixed_size (type_info); if (length < 0) { diff --git a/gi/pygi-array.c b/gi/pygi-array.c index c17ace0..000cc7b 100644 --- a/gi/pygi-array.c +++ b/gi/pygi-array.c @@ -511,7 +511,22 @@ _pygi_marshal_to_py_array (PyGIInvokeState *state, } else if (seq_cache->item_cache->type_tag == GI_TYPE_TAG_UINT8) { len = strlen (arg->v_pointer); } else { - len = g_strv_length ((gchar **)arg->v_pointer); + gboolean last; + gint i; + guint8 *data = arg->v_pointer; + + len = 0; + do { + last = TRUE; + for (i = 0; i < array_cache->item_size; i++) { + if (data[i] != 0) { + len += 1; + data += array_cache->item_size; + last = FALSE; + break; + } + } + } while (!last); } } else { GIArgument *len_arg = &state->arg_values[array_cache->len_arg_index]; -- 1.9.1