nx_fbx_compose_oom_gate_t181.nx source
↩ module page · 9 lines · 1489 B
1import "nx_fbx_bind.nx"
2func p(s:*u8)->i64{var n:i64=0;while s[n]!=(0 as u8){n=n+1};sys_write(1,s,n);return 0}
3func main()->i64{
4let a:*i64=sys_mmap(128) as *i64;let b:*i64=sys_mmap(128) as *i64;let out:*i64=sys_mmap(128) as *i64;let old:*i64=sys_mmap(16) as *i64;let limited:*i64=sys_mmap(16) as *i64;let check:*i64=sys_mmap(16) as *i64;var i:i64=0;while i<16{a[i]=0;b[i]=0;out[i]=777;i=i+1};a[0]=FBB_Q;a[5]=FBB_Q;a[10]=FBB_Q;a[15]=FBB_Q;b[0]=FBB_Q;b[5]=FBB_Q;b[10]=FBB_Q;b[15]=FBB_Q;
5if nx_prlimit(0,RLIMIT_AS,0 as *u8,old as *u8)!=0{p("FAIL read-process-limit\n");return 1};limited[0]=0;limited[1]=old[1];
6// Only this isolated test process: prohibit new mappings without consuming host memory.
7if nx_prlimit(0,RLIMIT_AS,limited as *u8,0 as *u8)!=0{p("FAIL set-process-limit\n");return 2};
8let readrc:i64=nx_prlimit(0,RLIMIT_AS,0 as *u8,check as *u8);let rc:i64=fbb_compose(a,b,out);let restored:i64=nx_prlimit(0,RLIMIT_AS,old as *u8,0 as *u8);
9if restored!=0{p("FAIL restore-process-limit\n");return 3};if readrc!=0||check[0]!=0||check[1]!=old[1]{p("FAIL limit-not-confirmed\n");return 4};if rc!=FBB_MEMORY{p("FAIL allocation-refusal-not-returned\n");return 5};i=0;while i<16{if out[i]!=777{p("FAIL output-mutated\n");return 6};i=i+1};if fbb_compose(a,b,out)!=0{p("FAIL recovery-after-restore\n");return 7};i=0;while i<16{if out[i]!=a[i]{p("FAIL recovered-output\n");return 8};i=i+1};p("PASS fbb-compose real-mmap-refusal output-unchanged limit-restored recovery-correct\n");return 0}