| 112 | } |
| 113 | |
| 114 | inline void kernel::Kasan::assert_write_access(uintptr_t addr, size_t size) |
| 115 | { |
| 116 | if (!_enabled) |
| 117 | return; |
| 118 | |
| 119 | _enabled = false; |
| 120 | |
| 121 | uintptr_t shadow_start = addr / 8; |
| 122 | uintptr_t shadow_end = (addr + size - 1) / 8; |
| 123 | |
| 124 | for (uintptr_t shadow_addr = shadow_start; shadow_addr <= shadow_end; shadow_addr++) |
| 125 | { |
| 126 | uint8_t shadow_value = _shadow_memory[shadow_addr]; |
| 127 | |
| 128 | // Calculate the first invalid byte within this shadow byte |
| 129 | uintptr_t first_invalid_byte = shadow_addr * 8; |
| 130 | if (first_invalid_byte < addr + size && (shadow_value == 0 || shadow_value == 0x1)) |
| 131 | { |
| 132 | fmt::err$("kasan: invalid write access at address {}, size {}\n", addr | fmt::FMT_HEX, size); |
| 133 | |
| 134 | unreachable$(); |
| 135 | } |
| 136 | } |
| 137 | |
| 138 | _enabled = true; |
| 139 | |
| 140 | this->_lock.release(); |
| 141 | } |
| 142 | |
| 143 | extern "C" void __asan_before_dynamic_init() |
| 144 | { |
no test coverage detected