• Mike Frysinger's avatar
    binfmt_misc: add comments & debug logs · 6b899c4e
    Mike Frysinger authored
    When trying to develop a custom format handler, the errors returned all
    effectively get bucketed as EINVAL with no kernel messages.  The other
    errors (ENOMEM/EFAULT) are internal/obvious and basic.  Thus any time a
    bad handler is rejected, the developer has to walk the dense code and
    try to guess where it went wrong.  Needing to dive into kernel code is
    itself a fairly high barrier for a lot of people.
    
    To improve this situation, let's deploy extensive pr_debug markers at
    logical parse points, and add comments to the dense parsing logic.  It
    let's you see exactly where the parsing aborts, the string the kernel
    received (useful when dealing with shell code), how it translated the
    buffers to binary data, and how it will apply the mask at runtime.
    
    Some example output:
      $ echo ':qemu-foo:M::\x7fELF\xAD\xAD\x01\x00:\xff\xff\xff\xff\xff\x00\xff\x00:/usr/bin/qemu-foo:POC' > register
      $ dmesg
      binfmt_misc: register: received 92 bytes
      binfmt_misc: register: delim: 0x3a {:}
      binfmt_misc: register: name: {qemu-foo}
      binfmt_misc: register: type: M (magic)
      binfmt_misc: register: offset: 0x0
      binfmt_misc: register: magic[raw]: 5c 78 37 66 45 4c 46 5c 78 41 44 5c 78 41 44 5c  \x7fELF\xAD\xAD\
      binfmt_misc: register: magic[raw]: 78 30 31 5c 78 30 30 00                          x01\x00.
      binfmt_misc: register:  mask[raw]: 5c 78 66 66 5c 78 66 66 5c 78 66 66 5c 78 66 66  \xff\xff\xff\xff
      binfmt_misc: register:  mask[raw]: 5c 78 66 66 5c 78 30 30 5c 78 66 66 5c 78 30 30  \xff\x00\xff\x00
      binfmt_misc: register:  mask[raw]: 00                                               .
      binfmt_misc: register: magic/mask length: 8
      binfmt_misc: register: magic[decoded]: 7f 45 4c 46 ad ad 01 00                          .ELF....
      binfmt_misc: register:  mask[decoded]: ff ff ff ff ff 00 ff 00                          ........
      binfmt_misc: register:  magic[masked]: 7f 45 4c 46 ad 00 01 00                          .ELF....
      binfmt_misc: register: interpreter: {/usr/bin/qemu-foo}
      binfmt_misc: register: flag: P (preserve argv0)
      binfmt_misc: register: flag: O (open binary)
      binfmt_misc: register: flag: C (preserve creds)
    
    The [raw] lines show us exactly what was received from userspace.  The
    lines after that show us how the kernel has decoded things.
    Signed-off-by: default avatarMike Frysinger <vapier@gentoo.org>
    Cc: Al Viro <viro@zeniv.linux.org.uk>
    Cc: Joe Perches <joe@perches.com>
    Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
    Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
    6b899c4e
binfmt_misc.c 18 KB