From d02308b53602236d3037bb822b131e7ccdd77dd9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebastian=20Dr=C3=B6ge?= Date: Wed, 27 Aug 2025 09:47:38 +0300 Subject: [PATCH 1/2] gio: `DataInputStream::read_line_async()` can return `None` slices Fixes https://github.com/gtk-rs/gtk-rs-core/issues/1802 --- gio/src/data_input_stream.rs | 27 ++++++++++++++++++--------- 1 file changed, 18 insertions(+), 9 deletions(-) diff --git a/gio/src/data_input_stream.rs b/gio/src/data_input_stream.rs index 07bfc1ca5822..1608fe098819 100644 --- a/gio/src/data_input_stream.rs +++ b/gio/src/data_input_stream.rs @@ -11,7 +11,7 @@ pub trait DataInputStreamExtManual: IsA + 'static { fn read_line>( &self, cancellable: Option<&P>, - ) -> Result, glib::Error> { + ) -> Result>, glib::Error> { unsafe { let mut length = mem::MaybeUninit::uninit(); let mut error = ptr::null_mut(); @@ -21,9 +21,13 @@ pub trait DataInputStreamExtManual: IsA + 'static { cancellable.map(|p| p.as_ref()).to_glib_none().0, &mut error, ); - let length = length.assume_init(); if error.is_null() { - Ok(FromGlibContainer::from_glib_full_num(ret, length)) + if ret.is_null() { + Ok(None) + } else { + let length = length.assume_init(); + Ok(Some(FromGlibContainer::from_glib_full_num(ret, length))) + } } else { Err(from_glib_full(error)) } @@ -33,7 +37,7 @@ pub trait DataInputStreamExtManual: IsA + 'static { #[doc(alias = "g_data_input_stream_read_line_async")] fn read_line_async< P: IsA, - Q: FnOnce(Result, glib::Error>) + 'static, + Q: FnOnce(Result>, glib::Error>) + 'static, >( &self, io_priority: glib::Priority, @@ -53,7 +57,7 @@ pub trait DataInputStreamExtManual: IsA + 'static { let user_data: Box_> = Box_::new(glib::thread_guard::ThreadGuard::new(callback)); unsafe extern "C" fn read_line_async_trampoline< - Q: FnOnce(Result, glib::Error>) + 'static, + Q: FnOnce(Result>, glib::Error>) + 'static, >( _source_object: *mut glib::gobject_ffi::GObject, res: *mut ffi::GAsyncResult, @@ -67,9 +71,13 @@ pub trait DataInputStreamExtManual: IsA + 'static { length.as_mut_ptr(), &mut error, ); - let length = length.assume_init(); let result = if error.is_null() { - Ok(FromGlibContainer::from_glib_full_num(ret, length)) + if ret.is_null() { + Ok(None) + } else { + let length = length.assume_init(); + Ok(Some(FromGlibContainer::from_glib_full_num(ret, length))) + } } else { Err(from_glib_full(error)) }; @@ -95,8 +103,9 @@ pub trait DataInputStreamExtManual: IsA + 'static { io_priority: glib::Priority, ) -> Pin< Box_< - dyn std::future::Future, glib::Error>> - + 'static, + dyn std::future::Future< + Output = Result>, glib::Error>, + > + 'static, >, > { Box_::pin(crate::GioFuture::new( From e7fc0d8f50ac1a992aa9a3b5b7ea11b8d74dd749 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebastian=20Dr=C3=B6ge?= Date: Wed, 27 Aug 2025 09:48:23 +0300 Subject: [PATCH 2/2] gio: Use correct finish function for `DataInputStream::read_line_utf8_async()` --- gio/src/data_input_stream.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gio/src/data_input_stream.rs b/gio/src/data_input_stream.rs index 1608fe098819..c3dce736ef20 100644 --- a/gio/src/data_input_stream.rs +++ b/gio/src/data_input_stream.rs @@ -168,7 +168,7 @@ pub trait DataInputStreamExtManual: IsA + 'static { user_data: glib::ffi::gpointer, ) { let mut error = ptr::null_mut(); - let ret = ffi::g_data_input_stream_read_line_finish( + let ret = ffi::g_data_input_stream_read_line_finish_utf8( _source_object as *mut _, res, ptr::null_mut(),