nx_png_capacity_gate_t278.nx source
↩ module page · 52 lines · 2976 B
1import "nx_png.nx"
2import "nx_sha256.nx"
3import "nx_lib_std.nx"
4func pg_hash(b:*u8,n:i64)->i64 {
5 let d:*u8=sys_mmap_try(SHA256_DIGEST_BYTES);if (d as i64)<=0{return 0}
6 if sha256_digest_checked_native(b,n,d)!=0{return 0}
7 let hex:*u8="0123456789abcdef" as *u8;var i:i64=0
8 while i<SHA256_DIGEST_BYTES{let v:i64=d[i] as i64;sys_write(1,((hex as i64)+v/16) as *u8,1);sys_write(1,((hex as i64)+v%16) as *u8,1);i=i+1}
9 sys_munmap_direct(d,SHA256_DIGEST_BYTES);return 1
10}
11func pg_case(w:i64,h:i64)->i64{
12 let cap:i64=png_buf_cap(w,h);if cap<=0{return 0}
13 let n:i64=w*h;let fb:*i64=sys_mmap_try(n*8) as *i64;let b:*u8=sys_mmap_try(cap+2)
14 if (fb as i64)<=0 || (b as i64)<=0{return 0}
15 var i:i64=0;var seed:i64=17;while i<n{seed=(seed*1103515245+12345)&2147483647;fb[i]=seed&16777215;i=i+1}
16 b[0]=165 as u8;b[cap+1]=90 as u8;let out:*u8=((b as i64)+1) as *u8
17 let result:i64=write_png_buf_checked(fb,n,w,h,out,cap)
18 var ok:i64=1;if result<=0 || result>cap || b[0]!=(165 as u8) || b[cap+1]!=(90 as u8){ok=0}
19 std_puts("PNG-SHA " as *u8);pg_hash(out,result);std_putln("" as *u8)
20 out[0]=77 as u8
21 if write_png_buf_checked(fb,n,w,h,out,cap-1)>=0 || out[0]!=(77 as u8){ok=0}
22 if write_png_buf_checked(fb,n-1,w,h,out,cap)>=0 || out[0]!=(77 as u8){ok=0}
23 sys_munmap_direct(fb as *u8,n*8);sys_munmap_direct(b,cap+2);return ok
24}
25func pg_pages()->i64 {
26 // /proc/self/statm is seven unsigned decimal fields; buffer follows field count and i64 decimal width.
27 let cap:i64=7*21+1;let b:*u8=sys_mmap_try(cap);if (b as i64)<=0{return 0-1}
28 let fd:i64=sys_openat_rd("/proc/self/statm" as *u8);if fd<0{sys_munmap_direct(b,cap);return 0-1}
29 let n:i64=sys_read(fd,b,cap);sys_close(fd);var v:i64=0;var i:i64=0
30 if n<=0 || n>=cap{sys_munmap_direct(b,cap);return 0-1}
31 while i<n && b[i]>=(48 as u8) && b[i]<=(57 as u8){v=v*10+(b[i] as i64)-48;i=i+1}
32 sys_munmap_direct(b,cap);if i==0{return 0-1};return v
33}
34func pg_repeated()->i64{
35 let cap:i64=png_buf_cap(1,1);let out:*u8=sys_mmap_try(cap);let fb:*i64=sys_mmap_try(__size_of(i64)) as *i64
36 if (out as i64)<=0 || (fb as i64)<=0{return 0}
37 fb[0]=12345;let before:i64=pg_pages();var i:i64=0;var ok:i64=1
38 while i<32 {if write_png_buf_checked(fb,1,1,1,out,cap)<=0{ok=0};i=i+1}
39 let after:i64=pg_pages();if before<0 || after!=before{ok=0}
40 sys_munmap_direct(fb as *u8,__size_of(i64));sys_munmap_direct(out,cap);return ok
41}
42
43func main()->i64{
44 var pass:i64=0;pass=pass+pg_case(1,1);pass=pass+pg_case(3,5);pass=pass+pg_case(64,65);pass=pass+pg_case(480,1)
45 if png_buf_cap(0,1)<0 && png_buf_cap(1,0)<0 && png_buf_cap(2147483648,1)<0 && png_buf_cap(2147483647,2147483647)<0{pass=pass+1}
46 if png_buf_cap(2048,2048)==18877631{pass=pass+1}
47 pass=pass+pg_repeated()
48 if png_buf_cap(2147483647,600000000)<0{pass=pass+1}
49 if png_chunk_length_valid(2147483647)==1 && png_chunk_length_valid(2147483648)==0 && png_chunk_length_valid(0-1)==0{pass=pass+1}
50 if pass!=9{std_putln("PNG-CAPACITY FAIL" as *u8);return 1}
51 std_putln("PNG-CAPACITY 9/9 PASS" as *u8);return 0
52}