| |
| |
| |
| #include <cstdio> |
| #include <cstdint> |
| #include <cstdlib> |
| #include <cstring> |
| #include <vector> |
| int main() { |
| long pagesz = 16384; |
| off_t off = 100; |
| off_t mapoff = off & -pagesz; |
| long skew = (long)(off - mapoff); |
| |
| size_t file_size = SIZE_MAX - (size_t)skew + 16; |
| size_t mapsize = (size_t)skew + file_size; |
| fprintf(stderr, "skew=%ld file_size=%zu mapsize=%zu (wrapped)\n", skew, file_size, mapsize); |
| |
| std::vector<char> mapping(mapsize ? mapsize : 1, 'A'); |
| char *content = (char *)mapping.data() + skew; |
| fprintf(stderr, "mapping=%p end=%p content=%p (past_end=%d)\n", |
| (void *)mapping.data(), (void *)(mapping.data() + mapping.size()), |
| (void *)content, content >= mapping.data() + mapping.size()); |
| |
| size_t position = 0; |
| size_t len = 64; |
| if (position <= file_size) { |
| size_t remain = file_size - position; |
| size_t amt = len < remain ? len : remain; |
| char ptr[64]; |
| |
| memcpy(ptr, content + position, amt); |
| fprintf(stderr, "memcpy OOB completed (unexpected if unmapped)\n"); |
| } |
| return 0; |
| } |
|
|