[Top][All Lists]

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

rm and du segfault (out of stack)

From: Sami Farin
Subject: rm and du segfault (out of stack)
Date: Wed, 13 Mar 2002 04:56:44 +0200
User-agent: Mutt/1.3.25i


I was playing around with Linux and tmpfs, I made a big bunch
of dirs. I really mean BIG. Names were "A" x 2000.

$ rm -rf A*
Segmentation fault
$ du -sh
Segmentation fault

I have x86 Linux 2.4.18-rc2, glibc-2.2.4-19.3, fileutils-4.1 & 4.1.7.
Here gdb debug stuff from v4.1.7:

Program received signal SIGSEGV, Segmentation fault.
0x08049e66 in remove_dir (fs=0xbf7cc260, need_save_cwd=0, x=0xbffc8d60, 
    cwd_dev_ino=0xbf7ccb60) at remove.c:656
656       char *dir_name = fs->filename;
(gdb) bt
#0  0x08049e66 in remove_dir (fs=0xbf7cc260, need_save_cwd=0, x=0xbffc8d60, 
    cwd_dev_ino=0xbf7ccb60) at remove.c:656
#1  0x0804a7e5 in rm (fs=0xbf7cc260, user_specified_name=0, x=0xbffc8d60, 
    cwd_dev_ino=0xbf7ccb60) at remove.c:906
#2  0x08049992 in remove_cwd_entries (x=0xbffc8d60, cwd_dev_ino=0xbf7ccb60)
    at remove.c:536
#3  0x0804a14d in remove_dir (fs=0xbf7ccd00, need_save_cwd=0, x=0xbffc8d60, 
    cwd_dev_ino=0xbf7cd600) at remove.c:732
#4  0x0804a7e5 in rm (fs=0xbf7ccd00, user_specified_name=0, x=0xbffc8d60, 
    cwd_dev_ino=0xbf7cd600) at remove.c:906

(gdb) print *fs
$14 = {filename = 0x8053d43 'A' <repeats 200 times>..., have_filetype_mode = 1,
  have_full_mode = 1, have_device = 1, mode = 16832, st_ino = 38654705664,
  st_dev = 595832223039488000}
(gdb) disass $eip-32 $eip+32
Dump of assembler code from 0x8049e46 to 0x8049e86:
0x8049e46 <remove_file+630>:    in     (%dx),%eax
0x8049e47 <remove_file+631>:    (bad)  
0x8049e48 <remove_file+632>:    decl   0x26b4(%ebp)
0x8049e4e <remove_file+638>:    add    %al,(%eax)
0x8049e50 <remove_dir>: push   %ebp
0x8049e51 <remove_dir+1>:       mov    %esp,%ebp
0x8049e53 <remove_dir+3>:       push   %edi
0x8049e54 <remove_dir+4>:       push   %esi
0x8049e55 <remove_dir+5>:       push   %ebx
0x8049e56 <remove_dir+6>:       xor    %ebx,%ebx
0x8049e58 <remove_dir+8>:       sub    $0xfc,%esp
0x8049e5e <remove_dir+14>:      mov    0x10(%ebp),%edx
0x8049e61 <remove_dir+17>:      mov    0x8(%ebp),%eax
0x8049e64 <remove_dir+20>:      mov    (%eax),%eax
0x8049e66 <remove_dir+22>:      mov    %eax,0xffffff04(%ebp) <<<===
0x8049e6c <remove_dir+28>:      mov    0x8(%edx),%edx
0x8049e6f <remove_dir+31>:      test   %edx,%edx
0x8049e71 <remove_dir+33>:      je     0x804a5e0 <remove_dir+1936>
0x8049e77 <remove_dir+39>:      mov    0x10(%ebp),%ecx
0x8049e7a <remove_dir+42>:      mov    (%ecx),%edi
0x8049e7c <remove_dir+44>:      test   %edi,%edi
0x8049e7e <remove_dir+46>:      je     0x804a590 <remove_dir+1856>
0x8049e84 <remove_dir+52>:      mov    0x10(%ebp),%esi

(gdb) print $ebp
$16 = (void *) 0xbf7cc0e8

(PAGE_OFFSET - $ebp) is about my stack size (8192 KiB) in resource limits.

Can rm/du/etc memory usage be optimized? It needs to keep names of all
the dirs it traverses in memory?
Hmh, if that's the case, maybe I'll just create a specially crafted rm
which can remove those evil dirs (or just umount this time).

I don't know if find would work if I had more mem, now kernel says
kernel: Out of Memory: Killed process 28099 (find).
At least it didn't run out of stack.

"ls -R" fails in the beginning with "file name too long".

Safari - address@hidden - PGP key 0x427E7914 - http://iki.fi/safari/
  The UNIX Guru's View of Sex: "unzip ; strip ; touch ; finger ; \
  mount ; fsck ; more ; yes ; umount ; sleep"

Attachment: mkdir_chdir.c
Description: Text document

reply via email to

[Prev in Thread] Current Thread [Next in Thread]