Skip to content

Commit 72a9cbd

Browse files
authored
Merge pull request #1699 from sdroege/windows-safe-io-socket
gio: Use `OwnedSocket` / `BorrowedSocket` for Windows APIs on GSocket
2 parents 8042abb + 36c20b2 commit 72a9cbd

File tree

4 files changed

+45
-26
lines changed

4 files changed

+45
-26
lines changed

cairo/src/surface.rs

Lines changed: 15 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -78,14 +78,16 @@ impl Surface {
7878
#[doc(alias = "cairo_surface_get_mime_data")]
7979
#[doc(alias = "get_mime_data")]
8080
pub fn mime_data(&self, mime_type: &str) -> Option<Vec<u8>> {
81-
let data_ptr: *mut u8 = ptr::null_mut();
81+
let mut data_ptr: *mut u8 = ptr::null_mut();
8282
let mut length: c_ulong = 0;
83+
// The function actually needs a mutable pointer
84+
#[allow(clippy::unnecessary_mut_passed)]
8385
unsafe {
8486
let mime_type = CString::new(mime_type).unwrap();
8587
ffi::cairo_surface_get_mime_data(
8688
self.to_raw_none(),
8789
mime_type.as_ptr(),
88-
&data_ptr,
90+
&mut data_ptr,
8991
&mut length,
9092
);
9193
if !data_ptr.is_null() && length != 0 {
@@ -99,15 +101,19 @@ impl Surface {
99101
#[doc(alias = "cairo_surface_get_mime_data")]
100102
#[doc(alias = "get_mime_data_raw")]
101103
pub unsafe fn mime_data_raw(&self, mime_type: &str) -> Option<&[u8]> {
102-
let data_ptr: *mut u8 = ptr::null_mut();
104+
let mut data_ptr: *mut u8 = ptr::null_mut();
103105
let mut length: c_ulong = 0;
104106
let mime_type = CString::new(mime_type).unwrap();
105-
ffi::cairo_surface_get_mime_data(
106-
self.to_raw_none(),
107-
mime_type.as_ptr(),
108-
&data_ptr,
109-
&mut length,
110-
);
107+
// The function actually needs a mutable pointer
108+
#[allow(clippy::unnecessary_mut_passed)]
109+
{
110+
ffi::cairo_surface_get_mime_data(
111+
self.to_raw_none(),
112+
mime_type.as_ptr(),
113+
&mut data_ptr,
114+
&mut length,
115+
);
116+
}
111117
if !data_ptr.is_null() && length != 0 {
112118
Some(slice::from_raw_parts(
113119
data_ptr as *const u8,

gdk-pixbuf/src/pixbuf.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ impl Pixbuf {
3535
let bits_per_sample = bits_per_sample as usize;
3636

3737
let n_channels = if has_alpha { 4 } else { 3 };
38-
let last_row_len = width * ((n_channels * bits_per_sample + 7) / 8);
38+
let last_row_len = width * (n_channels * bits_per_sample).div_ceil(8);
3939

4040
let mut data: Box<T> = Box::new(data);
4141

gio/src/input_stream.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -417,7 +417,7 @@ impl<T: IsA<InputStream>> InputStreamAsyncBufRead<T> {
417417

418418
fn set_has_data(&mut self, buffer: Vec<u8>, valid: (usize, usize)) {
419419
match self.state {
420-
State::Reading { .. } | State::Transitioning { .. } => {
420+
State::Reading { .. } | State::Transitioning => {
421421
self.state = State::HasData { buffer, valid }
422422
}
423423
_ => panic!("Invalid state"),

gio/src/socket.rs

Lines changed: 28 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,9 @@
33
#[cfg(unix)]
44
use std::os::unix::io::{AsFd, AsRawFd, BorrowedFd, FromRawFd, IntoRawFd, OwnedFd, RawFd};
55
#[cfg(windows)]
6-
use std::os::windows::io::{AsRawSocket, FromRawSocket, IntoRawSocket, RawSocket};
6+
use std::os::windows::io::{
7+
AsRawSocket, AsSocket, BorrowedSocket, FromRawSocket, IntoRawSocket, OwnedSocket, RawSocket,
8+
};
79
#[cfg(feature = "v2_60")]
810
use std::time::Duration;
911
use std::{cell::RefCell, marker::PhantomData, mem::transmute, pin::Pin, ptr};
@@ -27,22 +29,24 @@ impl Socket {
2729
if error.is_null() {
2830
Ok(from_glib_full(ret))
2931
} else {
30-
libc::close(fd);
32+
let _ = OwnedFd::from_raw_fd(fd);
3133
Err(from_glib_full(error))
3234
}
3335
}
3436
}
3537
#[cfg(windows)]
3638
#[cfg_attr(docsrs, doc(cfg(windows)))]
37-
#[allow(clippy::missing_safety_doc)]
38-
pub unsafe fn from_socket(socket: impl IntoRawSocket) -> Result<Socket, glib::Error> {
39+
pub fn from_socket(socket: OwnedSocket) -> Result<Socket, glib::Error> {
3940
let socket = socket.into_raw_socket();
4041
let mut error = ptr::null_mut();
41-
let ret = ffi::g_socket_new_from_fd(socket as i32, &mut error);
42-
if error.is_null() {
43-
Ok(from_glib_full(ret))
44-
} else {
45-
Err(from_glib_full(error))
42+
unsafe {
43+
let ret = ffi::g_socket_new_from_fd(socket as i32, &mut error);
44+
if error.is_null() {
45+
Ok(from_glib_full(ret))
46+
} else {
47+
let _ = OwnedSocket::from_raw_socket(socket);
48+
Err(from_glib_full(error))
49+
}
4650
}
4751
}
4852
}
@@ -74,6 +78,17 @@ impl AsRawSocket for Socket {
7478
}
7579
}
7680

81+
#[cfg(windows)]
82+
#[cfg_attr(docsrs, doc(cfg(windows)))]
83+
impl AsSocket for Socket {
84+
fn as_socket(&self) -> BorrowedSocket<'_> {
85+
unsafe {
86+
let raw_socket = self.as_raw_socket();
87+
BorrowedSocket::borrow_raw(raw_socket)
88+
}
89+
}
90+
}
91+
7792
#[doc(alias = "GInputVector")]
7893
#[repr(transparent)]
7994
#[derive(Debug)]
@@ -646,18 +661,16 @@ pub trait SocketExtManual: IsA<Socket> + Sized {
646661
#[cfg_attr(docsrs, doc(cfg(unix)))]
647662
#[doc(alias = "get_fd")]
648663
#[doc(alias = "g_socket_get_fd")]
649-
fn fd<T: FromRawFd>(&self) -> T {
650-
unsafe { FromRawFd::from_raw_fd(ffi::g_socket_get_fd(self.as_ref().to_glib_none().0)) }
664+
fn fd(&self) -> BorrowedFd<'_> {
665+
self.as_ref().as_fd()
651666
}
652667

653668
#[cfg(windows)]
654669
#[cfg_attr(docsrs, doc(cfg(windows)))]
655670
#[doc(alias = "get_socket")]
656671
#[doc(alias = "g_socket_get_fd")]
657-
fn socket<T: FromRawSocket>(&self) -> T {
658-
unsafe {
659-
FromRawSocket::from_raw_socket(ffi::g_socket_get_fd(self.as_ref().to_glib_none().0) as _)
660-
}
672+
fn socket(&self) -> BorrowedSocket<'_> {
673+
self.as_ref().as_socket()
661674
}
662675

663676
#[doc(alias = "g_socket_create_source")]

0 commit comments

Comments
 (0)