@@ -16,15 +16,15 @@ use crate::util::*;
1616use crate :: workqueue:: WorkError ;
1717use crate :: { buffer, file, fw, gpu, microseq, workqueue} ;
1818use crate :: { inner_ptr, inner_weak_ptr} ;
19+ use core:: mem:: MaybeUninit ;
1920use core:: sync:: atomic:: Ordering ;
2021use kernel:: dma_fence:: RawDmaFence ;
2122use kernel:: drm:: sched:: Job ;
22- use kernel:: io_buffer:: IoBufferReader ;
2323use kernel:: new_mutex;
2424use kernel:: prelude:: * ;
2525use kernel:: sync:: Arc ;
26+ use kernel:: uaccess:: { UserPtr , UserSlice } ;
2627use kernel:: uapi;
27- use kernel:: user_ptr:: UserSlicePtr ;
2828use kernel:: xarray;
2929
3030const DEBUG_CLASS : DebugFlags = DebugFlags :: Render ;
@@ -232,21 +232,19 @@ impl super::QueueInner::ver {
232232
233233 let cmdbuf_read_size =
234234 ( cmd. cmd_buffer_size as usize ) . min ( core:: mem:: size_of :: < uapi:: drm_asahi_cmd_render > ( ) ) ;
235- // SAFETY: This is the sole UserSlicePtr instance for this cmd_buffer.
236- let mut cmdbuf_reader = unsafe {
237- UserSlicePtr :: new (
238- cmd. cmd_buffer as usize as * mut _ ,
239- cmd. cmd_buffer_size as usize ,
240- )
241- . reader ( )
242- } ;
235+ // SAFETY: This is the sole UserSlice instance for this cmd_buffer.
236+ let mut cmdbuf_reader =
237+ UserSlice :: new ( cmd. cmd_buffer as UserPtr , cmd. cmd_buffer_size as usize ) . reader ( ) ;
243238
244239 let mut cmdbuf: uapi:: drm_asahi_cmd_render = Default :: default ( ) ;
245240 // SAFETY: The output pointer is valid, and the size does not exceed the type size
246241 // per the min() above, and all bit patterns are valid.
247- unsafe {
248- cmdbuf_reader. read_raw ( & mut cmdbuf as * mut _ as * mut u8 , cmdbuf_read_size) ?;
249- }
242+ cmdbuf_reader. read_raw ( unsafe {
243+ core:: slice:: from_raw_parts_mut (
244+ & mut cmdbuf as * mut _ as * mut MaybeUninit < u8 > ,
245+ cmdbuf_read_size,
246+ )
247+ } ) ?;
250248
251249 if cmdbuf. flags
252250 & !( uapi:: ASAHI_RENDER_NO_CLEAR_PIPELINE_TEXTURES
@@ -282,15 +280,12 @@ impl super::QueueInner::ver {
282280
283281 let mut ext_ptr = cmdbuf. extensions ;
284282 while ext_ptr != 0 {
285- let ext_type = u32:: from_ne_bytes (
286- // SAFETY: There is a double read from userspace here, but there is no TOCTOU
287- // issue since at worst the extension parse below will read garbage, and
288- // we do not trust any fields anyway.
289- unsafe { UserSlicePtr :: new ( ext_ptr as usize as * mut _ , 4 ) }
290- . read_all ( ) ?
291- . try_into ( )
292- . or ( Err ( EINVAL ) ) ?,
293- ) ;
283+ // SAFETY: There is a double read from userspace here, but there is no TOCTOU
284+ // issue since at worst the extension parse below will read garbage, and
285+ // we do not trust any fields anyway.
286+ let ext_type = UserSlice :: new ( ext_ptr as UserPtr , 4 )
287+ . reader ( )
288+ . read :: < u32 > ( ) ?;
294289
295290 match ext_type {
296291 uapi:: ASAHI_RENDER_EXT_UNKNOWNS => {
@@ -299,21 +294,19 @@ impl super::QueueInner::ver {
299294 return Err ( EINVAL ) ;
300295 }
301296 // SAFETY: See above
302- let mut ext_reader = unsafe {
303- UserSlicePtr :: new (
304- ext_ptr as usize as * mut _ ,
305- core:: mem:: size_of :: < uapi:: drm_asahi_cmd_render_unknowns > ( ) ,
306- )
307- . reader ( )
308- } ;
297+ let mut ext_reader = UserSlice :: new (
298+ ext_ptr as UserPtr ,
299+ core:: mem:: size_of :: < uapi:: drm_asahi_cmd_render_unknowns > ( ) ,
300+ )
301+ . reader ( ) ;
309302 // SAFETY: The output buffer is valid and of the correct size, and all bit
310303 // patterns are valid.
311- unsafe {
312- ext_reader . read_raw (
313- & mut unks as * mut _ as * mut u8 ,
304+ ext_reader . read_raw ( unsafe {
305+ core :: slice :: from_raw_parts_mut (
306+ & mut unks as * mut _ as * mut MaybeUninit < u8 > ,
314307 core:: mem:: size_of :: < uapi:: drm_asahi_cmd_render_unknowns > ( ) ,
315- ) ? ;
316- }
308+ )
309+ } ) ? ;
317310
318311 ext_ptr = unks. next ;
319312 }
@@ -322,21 +315,19 @@ impl super::QueueInner::ver {
322315 Default :: default ( ) ;
323316
324317 // SAFETY: See above
325- let mut ext_reader = unsafe {
326- UserSlicePtr :: new (
327- ext_ptr as usize as * mut _ ,
328- core:: mem:: size_of :: < uapi:: drm_asahi_cmd_render_user_timestamps > ( ) ,
329- )
330- . reader ( )
331- } ;
318+ let mut ext_reader = UserSlice :: new (
319+ ext_ptr as UserPtr ,
320+ core:: mem:: size_of :: < uapi:: drm_asahi_cmd_render_user_timestamps > ( ) ,
321+ )
322+ . reader ( ) ;
332323 // SAFETY: The output buffer is valid and of the correct size, and all bit
333324 // patterns are valid.
334- unsafe {
335- ext_reader . read_raw (
336- & mut ext_user_timestamps as * mut _ as * mut u8 ,
325+ ext_reader . read_raw ( unsafe {
326+ core :: slice :: from_raw_parts_mut (
327+ & mut ext_user_timestamps as * mut _ as * mut MaybeUninit < u8 > ,
337328 core:: mem:: size_of :: < uapi:: drm_asahi_cmd_render_user_timestamps > ( ) ,
338- ) ? ;
339- }
329+ )
330+ } ) ? ;
340331
341332 vtx_user_timestamps. start = common:: get_timestamp_object (
342333 objects,
0 commit comments