[pygobject] Fix array termination and size calculation
- From: Holger Berndt <hb src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [pygobject] Fix array termination and size calculation
- Date: Tue, 1 Nov 2011 17:51:46 +0000 (UTC)
commit eef35b2df8023ffff2d195ee16c084f5cfcb6ba3
Author: Holger Berndt <hb gnome org>
Date: Sun Oct 30 16:36:32 2011 +0100
Fix array termination and size calculation
When creating an array of element type uint8 and setting it directly with
memcpy(), make sure that zero-termination is respected.
When calculating the length of a zero-terminated array of type uint8,
fall back to strlen() instead of g_strv_length().
https://bugzilla.gnome.org/show_bug.cgi?id=662550
gi/pygi-marshal-from-py.c | 6 +++++-
gi/pygi-marshal-to-py.c | 8 +++++++-
2 files changed, 12 insertions(+), 2 deletions(-)
---
diff --git a/gi/pygi-marshal-from-py.c b/gi/pygi-marshal-from-py.c
index 0a94ffe..3b3109c 100644
--- a/gi/pygi-marshal-from-py.c
+++ b/gi/pygi-marshal-from-py.c
@@ -794,7 +794,11 @@ _pygi_marshal_from_py_array (PyGIInvokeState *state,
if (sequence_cache->item_cache->type_tag == GI_TYPE_TAG_UINT8 &&
PYGLIB_PyBytes_Check (py_arg)) {
memcpy(array_->data, PYGLIB_PyBytes_AsString (py_arg), length);
-
+ if (sequence_cache->is_zero_terminated) {
+ /* If array_ has been created with zero_termination, space for the
+ * terminator is properly allocated, so we're not off-by-one here. */
+ array_->data[length] = '\0';
+ }
goto array_success;
}
diff --git a/gi/pygi-marshal-to-py.c b/gi/pygi-marshal-to-py.c
index 984e7c1..67c21cb 100644
--- a/gi/pygi-marshal-to-py.c
+++ b/gi/pygi-marshal-to-py.c
@@ -266,6 +266,8 @@ _pygi_marshal_to_py_array (PyGIInvokeState *state,
array_ = arg->v_pointer;
+ g_assert(array_ != NULL);
+
/* GArrays make it easier to iterate over arrays
* with different element sizes but requires that
* we allocate a GArray if the argument was a C array
@@ -275,7 +277,11 @@ _pygi_marshal_to_py_array (PyGIInvokeState *state,
if (seq_cache->fixed_size >= 0) {
len = seq_cache->fixed_size;
} else if (seq_cache->is_zero_terminated) {
- len = g_strv_length ((gchar **)arg->v_pointer);
+ 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);
+ }
} else {
GIArgument *len_arg = state->args[seq_cache->len_arg_index];
len = len_arg->v_long;
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]