QA@IT

LinuxのCoreファイルサイズの制限が効かない

1885 PV

Linuxで少し古いカーネル(2.6.28)を使用しているのですが、setrlimitでCoreファイルの制限が効かないケースに遭遇しました。

具体的には以下の処理を行ったプロセスでCoreのサイズ制限が効いていませんでした。

  1. setrlimit()でCoreサイズを32MBに制限
  2. 64MBのメモリをmalloc()で確保
  3. 2で確保したメモリにアクセスせずにプロセスを終了

上記で出来たCoreのサイズは70MB以上あり、2で確保した領域も含まれていました。
ただし、malloc()した領域をmemsetで0クリアした場合はサイズ制限が効くようで、Coreは32MBになります。

Coreファイルを作成する、fs/binfmt_elf.c のelf_core_dump()の処理を確認してみました。

    for (addr = vma->vm_start; addr < end; addr += PAGE_SIZE) {
        struct page *page;
        int stop;

        page = get_dump_page(addr);
        if (page) {
            void *kaddr = kmap(page);
            stop = ((size += PAGE_SIZE) > cprm->limit) ||
            !dump_write(cprm->file, kaddr,
            PAGE_SIZE);
            kunmap(page);
            page_cache_release(page);
        } else
            stop = !dump_seek(cprm->file, PAGE_SIZE);
            if (stop)
                goto end_coredump;
            }
    }

elf_core_dump()はプロセスのvma情報をもとに、get_dump_page(addr)でページ情報を取得して、プロセスが使用しているメモリの内容をCoreファイルに書き込みます。この書き込みを行う、dump_write()と一緒に、setrlimit()で指定したCoreファイルサイズのチェックもしています。
今回のようにmalloc()をしただけで使用しない領域は、get_dump_page(addr)でページ情報が取得できないため、dump_seek()でファイルの位置を1ページ後ろにずらしています。そのさい、ファイルサイズのチェックや加算は行なっていません。

今回、皆様にお聞きしたいのは、dump_seek()でページサイズのチェックを実施していないことに何か理由があるのでしょうか?最近のカーネルも、本処理は変わっていないため、何か理由があるのかと思い質問してみました。回答以外でも、ご意見等を伺えれば助かります。よろしくお願いします。

ウォッチ

この質問への回答やコメントをメールでお知らせします。