@@ -88,7 +88,7 @@ impl super::QueueInner::ver {
8888 return Err ( EINVAL ) ;
8989 }
9090
91- // Overflow safety : all these calculations are done in u32.
91+ // This is overflow safe : all these calculations are done in u32.
9292 // At 64Kx64K max dimensions above, this is 2**32 pixels max.
9393 // In terms of tiles that are always larger than one pixel,
9494 // this can never overflow. Note that real actual dimensions
@@ -232,6 +232,7 @@ 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.
235236 let mut cmdbuf_reader = unsafe {
236237 UserSlicePtr :: new (
237238 cmd. cmd_buffer as usize as * mut _ ,
@@ -241,6 +242,8 @@ impl super::QueueInner::ver {
241242 } ;
242243
243244 let mut cmdbuf: uapi:: drm_asahi_cmd_render = Default :: default ( ) ;
245+ // SAFETY: The output pointer is valid, and the size does not exceed the type size
246+ // per the min() above, and all bit patterns are valid.
244247 unsafe {
245248 cmdbuf_reader. read_raw ( & mut cmdbuf as * mut _ as * mut u8 , cmdbuf_read_size) ?;
246249 }
@@ -280,6 +283,9 @@ impl super::QueueInner::ver {
280283 let mut ext_ptr = cmdbuf. extensions ;
281284 while ext_ptr != 0 {
282285 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.
283289 unsafe { UserSlicePtr :: new ( ext_ptr as usize as * mut _ , 4 ) }
284290 . read_all ( ) ?
285291 . try_into ( )
@@ -292,13 +298,16 @@ impl super::QueueInner::ver {
292298 cls_pr_debug ! ( Errors , "Overrides not enabled\n " ) ;
293299 return Err ( EINVAL ) ;
294300 }
301+ // SAFETY: See above
295302 let mut ext_reader = unsafe {
296303 UserSlicePtr :: new (
297304 ext_ptr as usize as * mut _ ,
298305 core:: mem:: size_of :: < uapi:: drm_asahi_cmd_render_unknowns > ( ) ,
299306 )
300307 . reader ( )
301308 } ;
309+ // SAFETY: The output buffer is valid and of the correct size, and all bit
310+ // patterns are valid.
302311 unsafe {
303312 ext_reader. read_raw (
304313 & mut unks as * mut _ as * mut u8 ,
@@ -312,13 +321,16 @@ impl super::QueueInner::ver {
312321 let mut ext_user_timestamps: uapi:: drm_asahi_cmd_render_user_timestamps =
313322 Default :: default ( ) ;
314323
324+ // SAFETY: See above
315325 let mut ext_reader = unsafe {
316326 UserSlicePtr :: new (
317327 ext_ptr as usize as * mut _ ,
318328 core:: mem:: size_of :: < uapi:: drm_asahi_cmd_render_user_timestamps > ( ) ,
319329 )
320330 . reader ( )
321331 } ;
332+ // SAFETY: The output buffer is valid and of the correct size, and all bit
333+ // patterns are valid.
322334 unsafe {
323335 ext_reader. read_raw (
324336 & mut ext_user_timestamps as * mut _ as * mut u8 ,
0 commit comments