加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

使用setrlimit()设置堆栈大小,并引发堆栈溢出/ segfault

发布时间:2020-12-16 05:45:09 所属栏目:百科 来源:网络整理
导读:在下面给出的例子中,我尝试将stacksize设置为1kb. 为什么现在可以在foo()中的大小为8kb的堆栈上分配一个int数组? #include stdio.h#include sys/resource.hvoid foo(void);int main() { struct rlimit lim = {1024,1024}; if (setrlimit(RLIMIT_STACK,lim)
在下面给出的例子中,我尝试将stacksize设置为1kb.

为什么现在可以在foo()中的大小为8kb的堆栈上分配一个int数组?

#include <stdio.h>
#include <sys/resource.h>

void foo(void);

int main() {
 struct rlimit lim = {1024,1024};

 if (setrlimit(RLIMIT_STACK,&lim) == -1)
  return 1;

 foo();

 return 0;
}

void foo() {
 unsigned ints[2048];

 printf("foo: %un",ints[2047]=42);
}

解决方法

该限制立即设置,但仅在尝试分配新堆栈或尝试扩展现有堆栈时进行检查.内核来源的RLIMIT_STACK( or a LXR identifier search)的grep应该告诉你.

显然,堆栈的初始大小是文件名env strings arg字符串加上在setup_arg_pages上分配的额外页面(2.6.33 1,2中的20页,2.6.34 3中的128 Kb)所需要的.

综上所述:

initial stack size = MIN(size for filename + arg strings + env strings + extra pages,MAX(size for filename + arg strings + env strings,RLIMIT_STACK))

哪里

size for filename + arg strings + env strings <= MAX(ARG_MAX(32 pages),RLIMIT_STACK/4)

另外,Ingo Molnar的exec-shield补丁(Fedora,Ubuntu,…)的内核还有一个额外的EXEC_STACK_BIAS(“2MB以上的随机化效果”),请参见从acct_stack_growth()调用新函数over_stack_limit() [Ubuntu1],[Ubuntu2],[Ubuntu3]).

我已经编辑了原来的程序来显示:

#include <stdio.h>
#include <sys/resource.h>

void foo(void);

int main(int argc,char *argv[]) {
        struct rlimit lim = {1,1};


        if (argc > 1 && argv[1][0] == '-' && argv[1][8]=='l') {
                printf("limiting stack sizen");
                if (setrlimit(RLIMIT_STACK,&lim) == -1) {
                        printf("rlimit failedn");
                        return 1;
                }
        }

        foo();

        return 0;
}

void foo() {
        unsigned ints[32768];

        printf("foo: %un",ints[2047]=42);
}

其结果如下:

$./rl
foo: 42
$./rl -l
limiting stack size
Segmentation fault
$

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读