• Alexey Dobriyan's avatar
    proc: fix /proc/*/map_files lookup · ac7f1061
    Alexey Dobriyan authored
    Current code does:
    
    	if (sscanf(dentry->d_name.name, "%lx-%lx", start, end) != 2)
    
    However sscanf() is broken garbage.
    
    It silently accepts whitespace between format specifiers
    (did you know that?).
    
    It silently accepts valid strings which result in integer overflow.
    
    Do not use sscanf() for any even remotely reliable parsing code.
    
    	OK
    	# readlink '/proc/1/map_files/55a23af39000-55a23b05b000'
    	/lib/systemd/systemd
    
    	broken
    	# readlink '/proc/1/map_files/               55a23af39000-55a23b05b000'
    	/lib/systemd/systemd
    
    	broken
    	# readlink '/proc/1/map_files/55a23af39000-55a23b05b000    '
    	/lib/systemd/systemd
    
    	very broken
    	# readlink '/proc/1/map_files/1000000000000000055a23af39000-55a23b05b000'
    	/lib/systemd/systemd
    
    Andrei said:
    
    : This patch breaks criu.  It was a bug in criu.  And this bug is on a minor
    : path, which works when memfd_create() isn't available.  It is a reason why
    : I ask to not backport this patch to stable kernels.
    :
    : In CRIU this bug can be triggered, only if this patch will be backported
    : to a kernel which version is lower than v3.16.
    
    Link: http://lkml.kernel.org/r/20171120212706.GA14325@avx2Signed-off-by: default avatarAlexey Dobriyan <adobriyan@gmail.com>
    Cc: Pavel Emelyanov <xemul@openvz.org>
    Cc: Andrei Vagin <avagin@virtuozzo.com>
    Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
    Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
    ac7f1061
base.c 85.6 KB