• David Howells's avatar
    [PATCH] FDPIC: fix the /proc/pid/stat representation of executable boundaries · aa289b47
    David Howells authored
    Fix the /proc/pid/stat representation of executable boundaries.  It should
    show the bounds of the executable, but instead shows the bounds of the
    loader.
    
    Before the patch is applied, the bug can be seen by examining, say, inetd:
    
    	# ps | grep inetd
    	  610         root          0   S   /usr/sbin/inetd -i
    	# cat /proc/610/maps
    	c0bb0000-c0bba788 r-xs 00000000 00:0b 14582157  /lib/ld-uClibc-0.9.28.so
    	c3180000-c31dede4 r-xs 00000000 00:0b 14582179  /lib/libuClibc-0.9.28.so
    	c328c000-c328ea00 rw-p 00008000 00:0b 14582157  /lib/ld-uClibc-0.9.28.so
    	c3290000-c329b6c0 rw-p 00000000 00:00 0
    	c32a0000-c32c0000 rwxp 00000000 00:00 0
    	c32d4000-c32d8000 rw-p 00000000 00:00 0
    	c3394000-c3398000 rw-p 00000000 00:00 0
    	c3458000-c345f464 r-xs 00000000 00:0b 16384612  /usr/sbin/inetd
    	c3470000-c34748f8 rw-p 00004000 00:0b 16384612  /usr/sbin/inetd
    	c34cc000-c34d0000 rw-p 00000000 00:00 0
    	c34d4000-c34d8000 rw-p 00000000 00:00 0
    	c34d8000-c34dc000 rw-p 00000000 00:00 0
    	# cat /proc/610/stat
    	610 (inetd) S 1 610 610 0 -1 256 0 0 0 0 0 8 0 0 19 0 1 0 94392000718
    	950272 0 4294967295 3233480704 3233523592 3274440352 3274439976
     	3273467584 0 0 4096 90115 3221712796 0 0 17 0 0 0 0
    
    The code boundaries are 3233480704 to 3233523592, which are:
    
    	(gdb) p/x 3233480704
    	$1 = 0xc0bb0000
    	(gdb) p/x 3233523592
    	$2 = 0xc0bba788
    
    Which corresponds to this line in the maps file:
    
    	c0bb0000-c0bba788 r-xs 00000000 00:0b 14582157  /lib/ld-uClibc-0.9.28.so
    
    Which is wrong.  After the patch is applied, the maps file is pretty much
    identical (there's some minor shuffling of the location of some of the
    anonymous VMAs), but the stat file is now:
    
    	# cat /proc/610/stat
    	610 (inetd) S 1 610 610 0 -1 256 0 0 0 0 0 7 0 0 18 0 1 0 94392000722
    	950272 0 4294967295 3276111872 3276141668 3274440352 3274439976
    	3273467584 0 0 4096 90115 3221712796 0 0 17 0 0 0 0
    
    The code boundaries are then 3276111872 to 3276141668, which are:
    
    	(gdb) p/x 3276111872
    	$1 = 0xc3458000
    	(gdb) p/x 3276141668
    	$2 = 0xc345f464
    
    And these correspond to this line in the maps file instead:
    
    	c3458000-c345f464 r-xs 00000000 00:0b 16384612  /usr/sbin/inetd
    
    Which is now correct.
    Signed-off-by: default avatarDavid Howells <dhowells@redhat.com>
    Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
    Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
    aa289b47
binfmt_elf_fdpic.c 46.8 KB