diff options
-rw-r--r-- | ChangeLog | 15 | ||||
-rw-r--r-- | gio/gfile.override | 5 | ||||
-rw-r--r-- | gio/gio.override | 14 | ||||
-rw-r--r-- | gio/goutputstream.override | 5 |
4 files changed, 35 insertions, 4 deletions
@@ -1,3 +1,18 @@ +2008-12-21 Paul Pogonyshev <pogonyshev@gmx.net> + + Bug 564102 – _wrap_g_output_stream_write_async not adding a + reference to the buffer passed + + * gio/gio.override (pygio_notify_copy_buffer): New function. + (pygio_free_notify): Free new `buffer' field if it is set. + + * gio/goutputstream.override (_wrap_g_output_stream_write_async): + Copy the buffer with new pygio_notify_copy_buffer() and use the + copy for g_output_stream_write_async() call. + + * gio/gfile.override (_wrap_g_file_replace_contents_async): Same + as for _wrap_g_output_stream_write_async(). + 2008-12-03 Paul Pogonyshev <pogonyshev@gmx.net> * glib/pyglib.c (pyglib_error_check): Test if `domain' is not-null diff --git a/gio/gfile.override b/gio/gfile.override index 77dad6f..deb43e8 100644 --- a/gio/gfile.override +++ b/gio/gfile.override @@ -1110,9 +1110,10 @@ _wrap_g_file_replace_contents_async(PyGObject *self, PyObject *args, PyObject *k Py_INCREF(notify->callback); Py_XINCREF(notify->data); + pygio_notify_copy_buffer(notify, contents, length); g_file_replace_contents_async(G_FILE(self->obj), - contents, - length, + notify->buffer, + notify->buffer_size, etag, make_backup, flags, diff --git a/gio/gio.override b/gio/gio.override index e6916a0..0f6ae5f 100644 --- a/gio/gio.override +++ b/gio/gio.override @@ -36,6 +36,8 @@ headers typedef struct { PyObject *callback; PyObject *data; + gpointer buffer; + gsize buffer_size; } PyGIONotify; static void @@ -45,10 +47,22 @@ py_decref_callback (gpointer data) } static void +pygio_notify_copy_buffer(PyGIONotify *notify, gpointer buffer, gsize buffer_size) +{ + if (buffer_size > 0) { + notify->buffer = g_slice_copy(buffer_size, buffer); + notify->buffer_size = buffer_size; + } +} + +static void pygio_free_notify(PyGIONotify *notify) { Py_XDECREF(notify->callback); Py_XDECREF(notify->data); + if (notify->buffer) + g_slice_free1(notify->buffer_size, notify->buffer); + g_slice_free(PyGIONotify, notify); } diff --git a/gio/goutputstream.override b/gio/goutputstream.override index 3b44632..df9ea94 100644 --- a/gio/goutputstream.override +++ b/gio/goutputstream.override @@ -130,9 +130,10 @@ _wrap_g_output_stream_write_async(PyGObject *self, if (!pygio_check_cancellable(pycancellable, &cancellable)) return NULL; + pygio_notify_copy_buffer(notify, buffer, count); g_output_stream_write_async(G_OUTPUT_STREAM(self->obj), - buffer, - count, + notify->buffer, + notify->buffer_size, io_priority, cancellable, (GAsyncReadyCallback)async_result_callback_marshal, |