ptmalloc - 如何讓其崩潰
我的上一篇文章寫的是malloc的最終章,那麼你是不是猜下一篇就是寫free,我也是這樣想的,然而。。。並不是,free的代碼我大概掃了一下,實在是名不符其實。真令我失望的free,乾脆下次再寫把。這次我寫些可以玩崩malloc的代碼。
sbrk
#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
#include <malloc.h>
#include <unistd.h>
#include <errno.h>
int main(void)
{
void *first = malloc(32);
void *second = malloc(10240);
malloc_stats();
if (sbrk(-10240) == NULL) {
perror("sbrk");
return -1;
}
void *third = malloc(131040);
malloc_stats();
free(first);
free(second);
free(third);
return 0;
}
效果
Segment fault
原因
malloc申請內存是通過sbrk和mmap,sbrk是通過增長program break,那麼,如果你sbrk(-size),就等於縮減program break,malloc訪問到已經釋放的段,肯定會掛的。
你可能在想,那我sbrk(size),不縮減行麼,可以倒是可以,malloc裏面會處理sbrk後斷開的情況。
建議
malloc和sbrk儘量不要同時使用。