Deny more windows unsafe_op_in_unsafe_fn · model-checking/verify-rust-std@f3bb34b (original) (raw)
1
1
`#![unstable(issue = "none", feature = "windows_handle")]
`
2
``
`-
#![allow(unsafe_op_in_unsafe_fn)]
`
3
2
``
4
3
`#[cfg(test)]
`
5
4
`mod tests;
`
`@@ -73,7 +72,7 @@ impl IntoRawHandle for Handle {
`
73
72
``
74
73
`impl FromRawHandle for Handle {
`
75
74
`unsafe fn from_raw_handle(raw_handle: RawHandle) -> Self {
`
76
``
`-
Self(FromRawHandle::from_raw_handle(raw_handle))
`
``
75
`+
unsafe { Self(FromRawHandle::from_raw_handle(raw_handle)) }
`
77
76
`}
`
78
77
`}
`
79
78
``
`@@ -142,19 +141,23 @@ impl Handle {
`
142
141
`buf: &mut [u8],
`
143
142
`overlapped: *mut c::OVERLAPPED,
`
144
143
`) -> io::Result<Option> {
`
145
``
`-
let len = cmp::min(buf.len(), u32::MAX as usize) as u32;
`
146
``
`-
let mut amt = 0;
`
147
``
`-
let res =
`
148
``
`-
cvt(c::ReadFile(self.as_raw_handle(), buf.as_mut_ptr(), len, &mut amt, overlapped));
`
149
``
`-
match res {
`
150
``
`-
Ok(_) => Ok(Some(amt as usize)),
`
151
``
`-
Err(e) => {
`
152
``
`-
if e.raw_os_error() == Some(c::ERROR_IO_PENDING as i32) {
`
153
``
`-
Ok(None)
`
154
``
`-
} else if e.raw_os_error() == Some(c::ERROR_BROKEN_PIPE as i32) {
`
155
``
`-
Ok(Some(0))
`
156
``
`-
} else {
`
157
``
`-
Err(e)
`
``
144
`+
// SAFETY: We have exclusive access to the buffer and it's up to the caller to
`
``
145
`+
// ensure the OVERLAPPED pointer is valid for the lifetime of this function.
`
``
146
`+
unsafe {
`
``
147
`+
let len = cmp::min(buf.len(), u32::MAX as usize) as u32;
`
``
148
`+
let mut amt = 0;
`
``
149
`+
let res =
`
``
150
`+
cvt(c::ReadFile(self.as_raw_handle(), buf.as_mut_ptr(), len, &mut amt, overlapped));
`
``
151
`+
match res {
`
``
152
`+
Ok(_) => Ok(Some(amt as usize)),
`
``
153
`+
Err(e) => {
`
``
154
`+
if e.raw_os_error() == Some(c::ERROR_IO_PENDING as i32) {
`
``
155
`+
Ok(None)
`
``
156
`+
} else if e.raw_os_error() == Some(c::ERROR_BROKEN_PIPE as i32) {
`
``
157
`+
Ok(Some(0))
`
``
158
`+
} else {
`
``
159
`+
Err(e)
`
``
160
`+
}
`
158
161
`}
`
159
162
`}
`
160
163
`}
`
`@@ -230,20 +233,24 @@ impl Handle {
`
230
233
``
231
234
`// The length is clamped at u32::MAX.
`
232
235
`let len = cmp::min(len, u32::MAX as usize) as u32;
`
233
``
`-
let status = c::NtReadFile(
`
234
``
`-
self.as_handle(),
`
235
``
`-
ptr::null_mut(),
`
236
``
`-
None,
`
237
``
`-
ptr::null_mut(),
`
238
``
`-
&mut io_status,
`
239
``
`-
buf,
`
240
``
`-
len,
`
241
``
`-
offset.map(|n| n as _).as_ref(),
`
242
``
`-
None,
`
243
``
`-
);
`
``
236
`` +
// SAFETY: It's up to the caller to ensure buf
is writeable up to
``
``
237
`` +
// the provided len
.
``
``
238
`+
let status = unsafe {
`
``
239
`+
c::NtReadFile(
`
``
240
`+
self.as_handle(),
`
``
241
`+
ptr::null_mut(),
`
``
242
`+
None,
`
``
243
`+
ptr::null_mut(),
`
``
244
`+
&mut io_status,
`
``
245
`+
buf,
`
``
246
`+
len,
`
``
247
`+
offset.map(|n| n as _).as_ref(),
`
``
248
`+
None,
`
``
249
`+
)
`
``
250
`+
};
`
244
251
``
245
252
`let status = if status == c::STATUS_PENDING {
`
246
``
`-
c::WaitForSingleObject(self.as_raw_handle(), c::INFINITE);
`
``
253
`+
unsafe { c::WaitForSingleObject(self.as_raw_handle(), c::INFINITE) };
`
247
254
` io_status.status()
`
248
255
`} else {
`
249
256
` status
`
`@@ -261,7 +268,7 @@ impl Handle {
`
261
268
` status if c::nt_success(status) => Ok(io_status.Information),
`
262
269
``
263
270
` status => {
`
264
``
`-
let error = c::RtlNtStatusToDosError(status);
`
``
271
`+
let error = unsafe { c::RtlNtStatusToDosError(status) };
`
265
272
`Err(io::Error::from_raw_os_error(error as _))
`
266
273
`}
`
267
274
`}
`