nx_wasm_layout_verify_lib.nx source
↩ module page · 62 lines · 2227 B
1// Independent NXWLAY01 reader; no compiler allocator or record writer dependency.
2const WLV_HEADER: i64=64
3const WLV_ROW: i64=32
4const WLV_PAGE: i64=65536
5const WLV_CELL: i64=8
6const WLV_MAX: i64=4294967296
7
8func wlv_word(b: *u8,at: i64) -> i64 {
9 if b[at+7]>=128 { return -1 }
10 var v: i64=0
11 var i: i64=7
12 while i>=0 { v=v*256+b[at+i] as i64;i=i-1 }
13 return v
14}
15func wlv_check(b: *u8,n: i64,shared: i64) -> i64 {
16 if b==(0 as *u8) || n<WLV_HEADER { return 0 }
17 if shared!=0 && shared!=1 { return 0 }
18 let magic: *u8="NXWLAY01" as *u8
19 var k: i64=0
20 while k<8 { if b[k]!=magic[k] { return 0 };k=k+1 }
21 if wlv_word(b,8)!=1 || wlv_word(b,56)!=n { return 0 }
22 let count: i64=wlv_word(b,16)
23 if count<0 || count!=(n-WLV_HEADER)/WLV_ROW { return 0 }
24 if (n-WLV_HEADER)%WLV_ROW!=0 { return 0 }
25 let arena: i64=wlv_word(b,24)
26 let pages: i64=wlv_word(b,32)
27 if arena<0 || arena>WLV_MAX || arena%WLV_PAGE!=0 { return 0 }
28 if pages<0 || pages>WLV_MAX/WLV_PAGE { return 0 }
29 let limit: i64=pages*WLV_PAGE
30 if arena>limit { return 0 }
31 var end: i64=arena
32 k=0
33 while k<count {
34 let row: i64=WLV_HEADER+k*WLV_ROW
35 if wlv_word(b,row)!=k { return 0 }
36 let start: i64=wlv_word(b,row+8)
37 let size: i64=wlv_word(b,row+16)
38 let flags: i64=wlv_word(b,row+24)
39 if flags<0 || flags>7 || size<0 { return 0 }
40 if (flags&2)!=0 && size==0 { return 0 }
41 if (flags&3)==3 { return 0 }
42 let padding: i64=(WLV_CELL-end%WLV_CELL)%WLV_CELL
43 if padding>limit-end { return 0 }
44 if start!=end+padding || size>limit-start { return 0 }
45 end=start+size
46 k=k+1
47 }
48 let state: i64=wlv_word(b,40)
49 let state_size: i64=wlv_word(b,48)
50 if shared==1 && count>0 {
51 let padding: i64=(WLV_CELL-end%WLV_CELL)%WLV_CELL
52 if padding>limit-end { return 0 }
53 if state!=end+padding || state_size!=WLV_CELL { return 0 }
54 if state_size>limit-state { return 0 }
55 end=state+state_size
56 } else {
57 if state!=0 || state_size!=0 { return 0 }
58 }
59 let required: i64=end/WLV_PAGE+((end%WLV_PAGE+WLV_PAGE-1)/WLV_PAGE)
60 if required!=pages { return 0 }
61 return 1
62}