• Michal Hocko's avatar
    elf: enforce MAP_FIXED on overlaying elf segments · ad55eac7
    Michal Hocko authored
    Anshuman has reported that with "fs, elf: drop MAP_FIXED usage from
    elf_map" applied, some ELF binaries in his environment fail to start
     [   23.423642] 9148 (sed): Uhuuh, elf segment at 0000000010030000 requested but the memory is mapped already
     [   23.423706] requested [10030000, 10040000] mapped [10030000, 10040000] 100073 anon
    The reason is that the above binary has overlapping elf segments:
      LOAD           0x0000000000000000 0x0000000010000000 0x0000000010000000
                     0x0000000000013a8c 0x0000000000013a8c  R E    10000
      LOAD           0x000000000001fd40 0x000000001002fd40 0x000000001002fd40
                     0x00000000000002c0 0x00000000000005e8  RW     10000
      LOAD           0x0000000000020328 0x0000000010030328 0x0000000010030328
                     0x0000000000000384 0x00000000000094a0  RW     10000
    That binary has two RW LOAD segments, the first crosses a page border
    into the second
      0x1002fd40 (LOAD2-vaddr) + 0x5e8 (LOAD2-memlen) == 0x10030328 (LOAD3-vaddr)
    Handle this situation by enforcing MAP_FIXED when we establish a
    temporary brk VMA to handle overlapping segments.  All other mappings
    will still use MAP_FIXED_NOREPLACE.
    Link: http://lkml.kernel.org/r/20180213100440.GM3443@dhcp22.suse.czSigned-off-by: default avatarMichal Hocko <mhocko@suse.com>
    Reported-by: default avatarAnshuman Khandual <khandual@linux.vnet.ibm.com>
    Reviewed-by: default avatarKhalid Aziz <khalid.aziz@oracle.com>
    Cc: Andrei Vagin <avagin@openvz.org>
    Cc: Michael Ellerman <mpe@ellerman.id.au>
    Cc: Kees Cook <keescook@chromium.org>
    Cc: Abdul Haleem <abdhalee@linux.vnet.ibm.com>
    Cc: Joel Stanley <joel@jms.id.au>
    Cc: Stephen Rothwell <sfr@canb.auug.org.au>
    Cc: Mark Brown <broonie@kernel.org>
    Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
    Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
binfmt_elf.c 63.6 KB