code wiki / (root) / nx_mmap_direct_lifecycle_gate_t181.nx

nx_mmap_direct_lifecycle_gate_t181.nx source

↩ module page · 13 lines · 1983 B

1import "nx_syscalls.nx" 2// Matching release for sys_mmap_try and other whole kernel mappings. 3// Never pass an arena allocation from sys_mmap: its small pointers may be interior. 4// Preserve the requested mapping length; the kernel applies its page rounding. 5const NXA_MAP_INVALID:i64=0-22 // Linux EINVAL, a protocol value rather than a resource budget. 6func sys_munmap_direct(addr:*u8,len:i64)->i64{ 7 if (addr as i64)<=0||len<=0{return NXA_MAP_INVALID} 8 return __syscall(11,addr as i64,len,0,0,0,0) 9} 10 11func mp(s:*u8)->i64{var n:i64=0;while s[n]!=(0 as u8){n=n+1};sys_write(1,s,n);return 0} 12func pages(buf:*u8)->i64{let fd:i64=sys_openat_rd("/proc/self/statm");if fd<0{return -1};let n:i64=sys_read(fd,buf,127);sys_close(fd);if n<=0{return -1};var i:i64=0;var v:i64=0;while i<n&&buf[i]>=(48 as u8)&&buf[i]<=(57 as u8){v=v*10+(buf[i] as i64)-48;i=i+1};if i==0{return -1};return v} 13func main()->i64{let buf:*u8=sys_mmap(128);let sizes:*i64=sys_mmap(32) as *i64;sizes[0]=1;sizes[1]=128;sizes[2]=256;sizes[3]=4096;var k:i64=0;while k<4{let p:*u8=sys_mmap_try(sizes[k]);if (p as i64)<=0{return 1};p[0]=17 as u8;if sys_munmap_direct(p,sizes[k])!=0{return 2};k=k+1};let before:i64=pages(buf);if before<=0{return 3};k=0;while k<4{var i:i64=0;while i<2048{let p:*u8=sys_mmap_try(sizes[k]);if (p as i64)<=0{return 4};p[0]=19 as u8;p[sizes[k]-1]=23 as u8;if sys_munmap_direct(p,sizes[k])!=0{return 5};i=i+1};k=k+1};let after:i64=pages(buf);if after!=before{mp("FAIL mapping-growth\n");return 6};let p:*u8=sys_mmap_try(128);if (p as i64)<=0{return 7};p[0]=29 as u8;if sys_munmap_direct(p,0)!=NXA_MAP_INVALID||sys_munmap_direct(p,0-1)!=NXA_MAP_INVALID||sys_munmap_direct(0 as *u8,128)!=NXA_MAP_INVALID{mp("FAIL invalid-length\n");return 8};if p[0]!=(29 as u8){return 9};if sys_munmap_direct(p,128)!=0{return 10};if pages(buf)!=before{return 11};mp("PASS mapping-lifecycle cycles=8192 sizes=1,128,256,4096 virtual-page-delta=0 invalid-lengths-refused mapping-survived-refusal\n");return 0}