UTF8 manipülasyon kitaplığım için bir birim testi yazıyorum ve bir işlev arabellek taşmasına giderse testimi segfault yapmak istiyorum. Bu yüzden bellekte yan yana iki sayfa mmap yapma fikri ile geldim, ilk PROT_READ | PROT_WRITE ve PROT_NONE ile ikinci. Bu şekilde, herhangi bir taşma olursa, bir segfault garanti edilir. Örnek:arka arkaya iki sayfa mma
void *addr1, *addr2; /* these are the pages; mmap call left out for simplicity */
char *p = (char *) (addr1 + getpagesize() - 8);
utf8_encode(aUtf8String, p, 8); // this shouldn't segfault
Sorun, ikinci sayfayı eşlediğimde program bölümlerim. İlginçtir ki
#include <stdio.h>
#include <errno.h>
#include <string.h>
#include <stdlib.h>
#include <sys/mman.h>
void checkMap(void *p)
{
if(p == MAP_FAILED) {
printf("error running mmap: %s\n", strerror(errno));
exit(1);
}
}
int main(void)
{
void *addr1, *addr2;
size_t pagesize;
pagesize = getpagesize();
checkMap(addr1 = mmap(NULL, pagesize, PROT_READ | PROT_WRITE, MAP_ANONYMOUS | MAP_PRIVATE, -1, 0));
checkMap(addr2 = mmap(addr1 + pagesize, pagesize, PROT_READ | PROT_WRITE, MAP_ANONYMOUS | MAP_PRIVATE | MAP_FIXED, -1, 0)); /* segfaults */
munmap(addr1, pagesize);
munmap(addr2, pagesize);
return 0;
}
, ilk mmap'in önce printf() ifadesi() başarıyla çalıştırmak için program neden olur: Burada sorunu yeniden üreten bir örnek program (GNU/Linux). Mmap'ın neden segfaulting olduğunu bilen var mı? Hedefim mmap() kullanılarak ulaşılamıyorsa, kimsenin arabellek taşması için kodumu nasıl test edebileceğime dair başka tavsiyeleri var mı?
Kodunuz benim için mükemmel çalışıyor. Tek şey getpageize() için unistd.h içermemenizdir. Derleyici türü tahmin edecektir. Bu 64bit sistemlerde sorunlara neden olabilir eğer 32bit int tahmin ederse düşünüyorum. –
Ben de test ettim ve segfaulting'i aldım, fakat main() içinde değil. Aksine, glibc'nin kodunda, çıkışta çöküyor ... Gerçekten garip, bu. Çok sade bir 32-bit makinede test ettim. – unwind
Sadece hangi sürümde/sürümde çalıştığınızı merak ediyor musunuz? Ben sadece 64-bit (#including unistd.h sonra) denedim ve şimdi munmap üzerinde başarısız olur. –