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}