2017-03-20 12 views
0

こんにちは私は、(オーバーフロー/セグメント化の障害)の例外を処理することにより、利用可能なスタックを動的に増加させるプロセスを実装しようとしています。動的にプロセスのスタックサイズを増加させる方法

ここでは、スタックに領域を再帰的に割り当てることで、SIGSEGVを出すまでスタックを拡張しています。この例外をハンドラで処理し、getrlimitとsetrlimitを使用してプロセスのリソース制限を増やしています。これはうまくいかないと思うので、私がraise()によってSIGSEGVをプログラムで生成しようとした場合、なぜスタックサイズを増やすことができるのですか?

#include<unistd.h> 
    #include<sys/resource.h> 
    #include<stdio.h> 
    #include<stdlib.h> 
    #include<signal.h> 
    #include<sys/time.h> 
    void allocate(void); 
    void handler(int sig) 
    { 
    struct rlimit r; 
    getrlimit(RLIMIT_STACK,&r); 
    r.rlim_cur=r.rlim_cur *5; // increasing stack size five times 
    setrlimit(RLIMIT_STACK,&r); 
    write(1,"Handler",7); //to check handler invocation 
    //signal(SIGSEGV,SIG_DFL); 
    } 

    int cntz=0xfff; //for adusting recursion 

    int main() 
    { 
    struct sigaction sa; 
    sigemptyset(&sa.sa_mask); 
    sa.sa_flags=0; 
    sa.sa_handler=handler; 
    sigaction(SIGSEGV,&sa,NULL); 
    //raise(SIGSEGV); to raise self signal to increase stack size 
    allocate(); 
    //getchar(); 
    exit(1); 

    } 

    void allocate() 
    { 
    char staczzk[5000]; //allocating memory on stack in each 
    recursive call 
    cntz--; 
    printf("%d\n",cntz); 
    if (cntz==0) 
    return; 
    allocate(); //recusrive call 
    } 
+0

'設定しよう:sigaltstack man pageからのコードと一緒にあなたのコードに基づいており、次の06/19/1)修復は失敗または関連する問題を引き起こす可能性があります。 Red Hat [Issue 1463241](https://bugzilla.redhat.com/show_bug.cgi?id=1463241) – jww

答えて

0

シグナルハンドラは、デフォルトでは残りのプログラムと同じスタックを使用し、allocateへの呼び出しのためにスタック領域は残っていません。

修正点は、代替信号スタックを使用することです。 rlimit_stack` [スタッククラッシュ](後http://www.openwall.com/lists/oss-security/2017/

int main() 
{ 
    struct sigaction sa; 
    stack_t ss; 

    ss.ss_sp = malloc(SIGSTKSZ); 
    if (ss.ss_sp == NULL) { perror("malloc"); exit(1); } 
    ss.ss_size = SIGSTKSZ; 
    ss.ss_flags = 0; 
    if (sigaltstack(&ss, NULL) == -1) { perror("sigaltstack"); exit(1); } 

    sigemptyset(&sa.sa_mask); 
    sa.sa_flags=SA_ONSTACK; 
    sa.sa_handler=handler; 
    if(sigaction(SIGSEGV,&sa,NULL)<0) { perror("sigaction"); exit(1); } 
    //raise(SIGSEGV); to raise self signal to increase stack size 
    allocate(); 
    exit(1); 
} 
+0

[searchcode](https://searchcode.com/?q=sigaltstack&src=3&src=2&lan=28)を参照してください。 )はオープンソースソフトウェアで約1000件のsigaltstackを使用していますが、その多くは重複しています(Cライブラリの多数のコピー)。 –

+0

go言語ランタイムシステムは、スタックをヒープから動的に割り当て(解放)ます。 https://dave.cheney.net/2013/06/02/why-is-a-goroutines-stack-infinite –

関連する問題