code wiki / (root) / nx_wasm_layout_verify_lib.nx

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}