| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282 |
- (module
- ;; Callee has ~1000 const cells (500 unique i64 constants).
- ;; When tiny_caller does a return_call to this function, the fast interpreter
- ;; must stage the parameter at frame->operand + callee->const_cell_num.
- ;; Without the fix, this write extends past the end of tiny_caller's small
- ;; frame and corrupts adjacent heap memory.
- (func $callee (param i32) (result i32)
- (drop (i64.add (i64.const 100000000001) (i64.const 100000000002)))
- (drop (i64.add (i64.const 100000000003) (i64.const 100000000004)))
- (drop (i64.add (i64.const 100000000005) (i64.const 100000000006)))
- (drop (i64.add (i64.const 100000000007) (i64.const 100000000008)))
- (drop (i64.add (i64.const 100000000009) (i64.const 100000000010)))
- (drop (i64.add (i64.const 100000000011) (i64.const 100000000012)))
- (drop (i64.add (i64.const 100000000013) (i64.const 100000000014)))
- (drop (i64.add (i64.const 100000000015) (i64.const 100000000016)))
- (drop (i64.add (i64.const 100000000017) (i64.const 100000000018)))
- (drop (i64.add (i64.const 100000000019) (i64.const 100000000020)))
- (drop (i64.add (i64.const 100000000021) (i64.const 100000000022)))
- (drop (i64.add (i64.const 100000000023) (i64.const 100000000024)))
- (drop (i64.add (i64.const 100000000025) (i64.const 100000000026)))
- (drop (i64.add (i64.const 100000000027) (i64.const 100000000028)))
- (drop (i64.add (i64.const 100000000029) (i64.const 100000000030)))
- (drop (i64.add (i64.const 100000000031) (i64.const 100000000032)))
- (drop (i64.add (i64.const 100000000033) (i64.const 100000000034)))
- (drop (i64.add (i64.const 100000000035) (i64.const 100000000036)))
- (drop (i64.add (i64.const 100000000037) (i64.const 100000000038)))
- (drop (i64.add (i64.const 100000000039) (i64.const 100000000040)))
- (drop (i64.add (i64.const 100000000041) (i64.const 100000000042)))
- (drop (i64.add (i64.const 100000000043) (i64.const 100000000044)))
- (drop (i64.add (i64.const 100000000045) (i64.const 100000000046)))
- (drop (i64.add (i64.const 100000000047) (i64.const 100000000048)))
- (drop (i64.add (i64.const 100000000049) (i64.const 100000000050)))
- (drop (i64.add (i64.const 100000000051) (i64.const 100000000052)))
- (drop (i64.add (i64.const 100000000053) (i64.const 100000000054)))
- (drop (i64.add (i64.const 100000000055) (i64.const 100000000056)))
- (drop (i64.add (i64.const 100000000057) (i64.const 100000000058)))
- (drop (i64.add (i64.const 100000000059) (i64.const 100000000060)))
- (drop (i64.add (i64.const 100000000061) (i64.const 100000000062)))
- (drop (i64.add (i64.const 100000000063) (i64.const 100000000064)))
- (drop (i64.add (i64.const 100000000065) (i64.const 100000000066)))
- (drop (i64.add (i64.const 100000000067) (i64.const 100000000068)))
- (drop (i64.add (i64.const 100000000069) (i64.const 100000000070)))
- (drop (i64.add (i64.const 100000000071) (i64.const 100000000072)))
- (drop (i64.add (i64.const 100000000073) (i64.const 100000000074)))
- (drop (i64.add (i64.const 100000000075) (i64.const 100000000076)))
- (drop (i64.add (i64.const 100000000077) (i64.const 100000000078)))
- (drop (i64.add (i64.const 100000000079) (i64.const 100000000080)))
- (drop (i64.add (i64.const 100000000081) (i64.const 100000000082)))
- (drop (i64.add (i64.const 100000000083) (i64.const 100000000084)))
- (drop (i64.add (i64.const 100000000085) (i64.const 100000000086)))
- (drop (i64.add (i64.const 100000000087) (i64.const 100000000088)))
- (drop (i64.add (i64.const 100000000089) (i64.const 100000000090)))
- (drop (i64.add (i64.const 100000000091) (i64.const 100000000092)))
- (drop (i64.add (i64.const 100000000093) (i64.const 100000000094)))
- (drop (i64.add (i64.const 100000000095) (i64.const 100000000096)))
- (drop (i64.add (i64.const 100000000097) (i64.const 100000000098)))
- (drop (i64.add (i64.const 100000000099) (i64.const 100000000100)))
- (drop (i64.add (i64.const 100000000101) (i64.const 100000000102)))
- (drop (i64.add (i64.const 100000000103) (i64.const 100000000104)))
- (drop (i64.add (i64.const 100000000105) (i64.const 100000000106)))
- (drop (i64.add (i64.const 100000000107) (i64.const 100000000108)))
- (drop (i64.add (i64.const 100000000109) (i64.const 100000000110)))
- (drop (i64.add (i64.const 100000000111) (i64.const 100000000112)))
- (drop (i64.add (i64.const 100000000113) (i64.const 100000000114)))
- (drop (i64.add (i64.const 100000000115) (i64.const 100000000116)))
- (drop (i64.add (i64.const 100000000117) (i64.const 100000000118)))
- (drop (i64.add (i64.const 100000000119) (i64.const 100000000120)))
- (drop (i64.add (i64.const 100000000121) (i64.const 100000000122)))
- (drop (i64.add (i64.const 100000000123) (i64.const 100000000124)))
- (drop (i64.add (i64.const 100000000125) (i64.const 100000000126)))
- (drop (i64.add (i64.const 100000000127) (i64.const 100000000128)))
- (drop (i64.add (i64.const 100000000129) (i64.const 100000000130)))
- (drop (i64.add (i64.const 100000000131) (i64.const 100000000132)))
- (drop (i64.add (i64.const 100000000133) (i64.const 100000000134)))
- (drop (i64.add (i64.const 100000000135) (i64.const 100000000136)))
- (drop (i64.add (i64.const 100000000137) (i64.const 100000000138)))
- (drop (i64.add (i64.const 100000000139) (i64.const 100000000140)))
- (drop (i64.add (i64.const 100000000141) (i64.const 100000000142)))
- (drop (i64.add (i64.const 100000000143) (i64.const 100000000144)))
- (drop (i64.add (i64.const 100000000145) (i64.const 100000000146)))
- (drop (i64.add (i64.const 100000000147) (i64.const 100000000148)))
- (drop (i64.add (i64.const 100000000149) (i64.const 100000000150)))
- (drop (i64.add (i64.const 100000000151) (i64.const 100000000152)))
- (drop (i64.add (i64.const 100000000153) (i64.const 100000000154)))
- (drop (i64.add (i64.const 100000000155) (i64.const 100000000156)))
- (drop (i64.add (i64.const 100000000157) (i64.const 100000000158)))
- (drop (i64.add (i64.const 100000000159) (i64.const 100000000160)))
- (drop (i64.add (i64.const 100000000161) (i64.const 100000000162)))
- (drop (i64.add (i64.const 100000000163) (i64.const 100000000164)))
- (drop (i64.add (i64.const 100000000165) (i64.const 100000000166)))
- (drop (i64.add (i64.const 100000000167) (i64.const 100000000168)))
- (drop (i64.add (i64.const 100000000169) (i64.const 100000000170)))
- (drop (i64.add (i64.const 100000000171) (i64.const 100000000172)))
- (drop (i64.add (i64.const 100000000173) (i64.const 100000000174)))
- (drop (i64.add (i64.const 100000000175) (i64.const 100000000176)))
- (drop (i64.add (i64.const 100000000177) (i64.const 100000000178)))
- (drop (i64.add (i64.const 100000000179) (i64.const 100000000180)))
- (drop (i64.add (i64.const 100000000181) (i64.const 100000000182)))
- (drop (i64.add (i64.const 100000000183) (i64.const 100000000184)))
- (drop (i64.add (i64.const 100000000185) (i64.const 100000000186)))
- (drop (i64.add (i64.const 100000000187) (i64.const 100000000188)))
- (drop (i64.add (i64.const 100000000189) (i64.const 100000000190)))
- (drop (i64.add (i64.const 100000000191) (i64.const 100000000192)))
- (drop (i64.add (i64.const 100000000193) (i64.const 100000000194)))
- (drop (i64.add (i64.const 100000000195) (i64.const 100000000196)))
- (drop (i64.add (i64.const 100000000197) (i64.const 100000000198)))
- (drop (i64.add (i64.const 100000000199) (i64.const 100000000200)))
- (drop (i64.add (i64.const 100000000201) (i64.const 100000000202)))
- (drop (i64.add (i64.const 100000000203) (i64.const 100000000204)))
- (drop (i64.add (i64.const 100000000205) (i64.const 100000000206)))
- (drop (i64.add (i64.const 100000000207) (i64.const 100000000208)))
- (drop (i64.add (i64.const 100000000209) (i64.const 100000000210)))
- (drop (i64.add (i64.const 100000000211) (i64.const 100000000212)))
- (drop (i64.add (i64.const 100000000213) (i64.const 100000000214)))
- (drop (i64.add (i64.const 100000000215) (i64.const 100000000216)))
- (drop (i64.add (i64.const 100000000217) (i64.const 100000000218)))
- (drop (i64.add (i64.const 100000000219) (i64.const 100000000220)))
- (drop (i64.add (i64.const 100000000221) (i64.const 100000000222)))
- (drop (i64.add (i64.const 100000000223) (i64.const 100000000224)))
- (drop (i64.add (i64.const 100000000225) (i64.const 100000000226)))
- (drop (i64.add (i64.const 100000000227) (i64.const 100000000228)))
- (drop (i64.add (i64.const 100000000229) (i64.const 100000000230)))
- (drop (i64.add (i64.const 100000000231) (i64.const 100000000232)))
- (drop (i64.add (i64.const 100000000233) (i64.const 100000000234)))
- (drop (i64.add (i64.const 100000000235) (i64.const 100000000236)))
- (drop (i64.add (i64.const 100000000237) (i64.const 100000000238)))
- (drop (i64.add (i64.const 100000000239) (i64.const 100000000240)))
- (drop (i64.add (i64.const 100000000241) (i64.const 100000000242)))
- (drop (i64.add (i64.const 100000000243) (i64.const 100000000244)))
- (drop (i64.add (i64.const 100000000245) (i64.const 100000000246)))
- (drop (i64.add (i64.const 100000000247) (i64.const 100000000248)))
- (drop (i64.add (i64.const 100000000249) (i64.const 100000000250)))
- (drop (i64.add (i64.const 100000000251) (i64.const 100000000252)))
- (drop (i64.add (i64.const 100000000253) (i64.const 100000000254)))
- (drop (i64.add (i64.const 100000000255) (i64.const 100000000256)))
- (drop (i64.add (i64.const 100000000257) (i64.const 100000000258)))
- (drop (i64.add (i64.const 100000000259) (i64.const 100000000260)))
- (drop (i64.add (i64.const 100000000261) (i64.const 100000000262)))
- (drop (i64.add (i64.const 100000000263) (i64.const 100000000264)))
- (drop (i64.add (i64.const 100000000265) (i64.const 100000000266)))
- (drop (i64.add (i64.const 100000000267) (i64.const 100000000268)))
- (drop (i64.add (i64.const 100000000269) (i64.const 100000000270)))
- (drop (i64.add (i64.const 100000000271) (i64.const 100000000272)))
- (drop (i64.add (i64.const 100000000273) (i64.const 100000000274)))
- (drop (i64.add (i64.const 100000000275) (i64.const 100000000276)))
- (drop (i64.add (i64.const 100000000277) (i64.const 100000000278)))
- (drop (i64.add (i64.const 100000000279) (i64.const 100000000280)))
- (drop (i64.add (i64.const 100000000281) (i64.const 100000000282)))
- (drop (i64.add (i64.const 100000000283) (i64.const 100000000284)))
- (drop (i64.add (i64.const 100000000285) (i64.const 100000000286)))
- (drop (i64.add (i64.const 100000000287) (i64.const 100000000288)))
- (drop (i64.add (i64.const 100000000289) (i64.const 100000000290)))
- (drop (i64.add (i64.const 100000000291) (i64.const 100000000292)))
- (drop (i64.add (i64.const 100000000293) (i64.const 100000000294)))
- (drop (i64.add (i64.const 100000000295) (i64.const 100000000296)))
- (drop (i64.add (i64.const 100000000297) (i64.const 100000000298)))
- (drop (i64.add (i64.const 100000000299) (i64.const 100000000300)))
- (drop (i64.add (i64.const 100000000301) (i64.const 100000000302)))
- (drop (i64.add (i64.const 100000000303) (i64.const 100000000304)))
- (drop (i64.add (i64.const 100000000305) (i64.const 100000000306)))
- (drop (i64.add (i64.const 100000000307) (i64.const 100000000308)))
- (drop (i64.add (i64.const 100000000309) (i64.const 100000000310)))
- (drop (i64.add (i64.const 100000000311) (i64.const 100000000312)))
- (drop (i64.add (i64.const 100000000313) (i64.const 100000000314)))
- (drop (i64.add (i64.const 100000000315) (i64.const 100000000316)))
- (drop (i64.add (i64.const 100000000317) (i64.const 100000000318)))
- (drop (i64.add (i64.const 100000000319) (i64.const 100000000320)))
- (drop (i64.add (i64.const 100000000321) (i64.const 100000000322)))
- (drop (i64.add (i64.const 100000000323) (i64.const 100000000324)))
- (drop (i64.add (i64.const 100000000325) (i64.const 100000000326)))
- (drop (i64.add (i64.const 100000000327) (i64.const 100000000328)))
- (drop (i64.add (i64.const 100000000329) (i64.const 100000000330)))
- (drop (i64.add (i64.const 100000000331) (i64.const 100000000332)))
- (drop (i64.add (i64.const 100000000333) (i64.const 100000000334)))
- (drop (i64.add (i64.const 100000000335) (i64.const 100000000336)))
- (drop (i64.add (i64.const 100000000337) (i64.const 100000000338)))
- (drop (i64.add (i64.const 100000000339) (i64.const 100000000340)))
- (drop (i64.add (i64.const 100000000341) (i64.const 100000000342)))
- (drop (i64.add (i64.const 100000000343) (i64.const 100000000344)))
- (drop (i64.add (i64.const 100000000345) (i64.const 100000000346)))
- (drop (i64.add (i64.const 100000000347) (i64.const 100000000348)))
- (drop (i64.add (i64.const 100000000349) (i64.const 100000000350)))
- (drop (i64.add (i64.const 100000000351) (i64.const 100000000352)))
- (drop (i64.add (i64.const 100000000353) (i64.const 100000000354)))
- (drop (i64.add (i64.const 100000000355) (i64.const 100000000356)))
- (drop (i64.add (i64.const 100000000357) (i64.const 100000000358)))
- (drop (i64.add (i64.const 100000000359) (i64.const 100000000360)))
- (drop (i64.add (i64.const 100000000361) (i64.const 100000000362)))
- (drop (i64.add (i64.const 100000000363) (i64.const 100000000364)))
- (drop (i64.add (i64.const 100000000365) (i64.const 100000000366)))
- (drop (i64.add (i64.const 100000000367) (i64.const 100000000368)))
- (drop (i64.add (i64.const 100000000369) (i64.const 100000000370)))
- (drop (i64.add (i64.const 100000000371) (i64.const 100000000372)))
- (drop (i64.add (i64.const 100000000373) (i64.const 100000000374)))
- (drop (i64.add (i64.const 100000000375) (i64.const 100000000376)))
- (drop (i64.add (i64.const 100000000377) (i64.const 100000000378)))
- (drop (i64.add (i64.const 100000000379) (i64.const 100000000380)))
- (drop (i64.add (i64.const 100000000381) (i64.const 100000000382)))
- (drop (i64.add (i64.const 100000000383) (i64.const 100000000384)))
- (drop (i64.add (i64.const 100000000385) (i64.const 100000000386)))
- (drop (i64.add (i64.const 100000000387) (i64.const 100000000388)))
- (drop (i64.add (i64.const 100000000389) (i64.const 100000000390)))
- (drop (i64.add (i64.const 100000000391) (i64.const 100000000392)))
- (drop (i64.add (i64.const 100000000393) (i64.const 100000000394)))
- (drop (i64.add (i64.const 100000000395) (i64.const 100000000396)))
- (drop (i64.add (i64.const 100000000397) (i64.const 100000000398)))
- (drop (i64.add (i64.const 100000000399) (i64.const 100000000400)))
- (drop (i64.add (i64.const 100000000401) (i64.const 100000000402)))
- (drop (i64.add (i64.const 100000000403) (i64.const 100000000404)))
- (drop (i64.add (i64.const 100000000405) (i64.const 100000000406)))
- (drop (i64.add (i64.const 100000000407) (i64.const 100000000408)))
- (drop (i64.add (i64.const 100000000409) (i64.const 100000000410)))
- (drop (i64.add (i64.const 100000000411) (i64.const 100000000412)))
- (drop (i64.add (i64.const 100000000413) (i64.const 100000000414)))
- (drop (i64.add (i64.const 100000000415) (i64.const 100000000416)))
- (drop (i64.add (i64.const 100000000417) (i64.const 100000000418)))
- (drop (i64.add (i64.const 100000000419) (i64.const 100000000420)))
- (drop (i64.add (i64.const 100000000421) (i64.const 100000000422)))
- (drop (i64.add (i64.const 100000000423) (i64.const 100000000424)))
- (drop (i64.add (i64.const 100000000425) (i64.const 100000000426)))
- (drop (i64.add (i64.const 100000000427) (i64.const 100000000428)))
- (drop (i64.add (i64.const 100000000429) (i64.const 100000000430)))
- (drop (i64.add (i64.const 100000000431) (i64.const 100000000432)))
- (drop (i64.add (i64.const 100000000433) (i64.const 100000000434)))
- (drop (i64.add (i64.const 100000000435) (i64.const 100000000436)))
- (drop (i64.add (i64.const 100000000437) (i64.const 100000000438)))
- (drop (i64.add (i64.const 100000000439) (i64.const 100000000440)))
- (drop (i64.add (i64.const 100000000441) (i64.const 100000000442)))
- (drop (i64.add (i64.const 100000000443) (i64.const 100000000444)))
- (drop (i64.add (i64.const 100000000445) (i64.const 100000000446)))
- (drop (i64.add (i64.const 100000000447) (i64.const 100000000448)))
- (drop (i64.add (i64.const 100000000449) (i64.const 100000000450)))
- (drop (i64.add (i64.const 100000000451) (i64.const 100000000452)))
- (drop (i64.add (i64.const 100000000453) (i64.const 100000000454)))
- (drop (i64.add (i64.const 100000000455) (i64.const 100000000456)))
- (drop (i64.add (i64.const 100000000457) (i64.const 100000000458)))
- (drop (i64.add (i64.const 100000000459) (i64.const 100000000460)))
- (drop (i64.add (i64.const 100000000461) (i64.const 100000000462)))
- (drop (i64.add (i64.const 100000000463) (i64.const 100000000464)))
- (drop (i64.add (i64.const 100000000465) (i64.const 100000000466)))
- (drop (i64.add (i64.const 100000000467) (i64.const 100000000468)))
- (drop (i64.add (i64.const 100000000469) (i64.const 100000000470)))
- (drop (i64.add (i64.const 100000000471) (i64.const 100000000472)))
- (drop (i64.add (i64.const 100000000473) (i64.const 100000000474)))
- (drop (i64.add (i64.const 100000000475) (i64.const 100000000476)))
- (drop (i64.add (i64.const 100000000477) (i64.const 100000000478)))
- (drop (i64.add (i64.const 100000000479) (i64.const 100000000480)))
- (drop (i64.add (i64.const 100000000481) (i64.const 100000000482)))
- (drop (i64.add (i64.const 100000000483) (i64.const 100000000484)))
- (drop (i64.add (i64.const 100000000485) (i64.const 100000000486)))
- (drop (i64.add (i64.const 100000000487) (i64.const 100000000488)))
- (drop (i64.add (i64.const 100000000489) (i64.const 100000000490)))
- (drop (i64.add (i64.const 100000000491) (i64.const 100000000492)))
- (drop (i64.add (i64.const 100000000493) (i64.const 100000000494)))
- (drop (i64.add (i64.const 100000000495) (i64.const 100000000496)))
- (drop (i64.add (i64.const 100000000497) (i64.const 100000000498)))
- (drop (i64.add (i64.const 100000000499) (i64.const 100000000500)))
- (local.get 0)
- )
- ;; Tiny caller: no locals, no constants. Does a return_call to $callee.
- ;; This is the vulnerable site: tiny_caller's frame has const_cell_num=0
- ;; but $callee has const_cell_num~=1000, so without the fix the fast
- ;; interpreter writes the staged parameter ~4000 bytes past the end of
- ;; tiny_caller's frame.
- (func $tiny_caller (result i32)
- (return_call $callee (i32.const 42))
- )
- ;; Builds up 1000 normal call frames then tail-calls through tiny_caller.
- (func $fill (param i32) (result i32)
- (if (result i32) (i32.gt_s (local.get 0) (i32.const 0))
- (then (call $fill (i32.sub (local.get 0) (i32.const 1))))
- (else (call $tiny_caller))
- )
- )
- (func (export "test") (result i32)
- (call $fill (i32.const 1000))
- )
- )
|