• Tyrel Datwyler's avatar
    PCI: rpadlpar: Fix potential drc_name corruption in store functions · cc7a0bb0
    Tyrel Datwyler authored
    Both add_slot_store() and remove_slot_store() try to fix up the
    drc_name copied from the store buffer by placing a NUL terminator at
    nbyte + 1 or in place of a '\n' if present. However, the static buffer
    that we copy the drc_name data into is not zeroed and can contain
    anything past the n-th byte.
    
    This is problematic if a '\n' byte appears in that buffer after nbytes
    and the string copied into the store buffer was not NUL terminated to
    start with as the strchr() search for a '\n' byte will mark this
    incorrectly as the end of the drc_name string resulting in a drc_name
    string that contains garbage data after the n-th byte.
    
    Additionally it will cause us to overwrite that '\n' byte on the stack
    with NUL, potentially corrupting data on the stack.
    
    The following debugging shows an example of the drmgr utility writing
    "PHB 4543" to the add_slot sysfs attribute, but add_slot_store()
    logging a corrupted string value.
    
      drmgr: drmgr: -c phb -a -s PHB 4543 -d 1
      add_slot_store: drc_name = PHB 4543°|<82>!, rc = -19
    
    Fix this by using strscpy() instead of memcpy() to ensure the string
    is NUL terminated when copied into the static drc_name buffer.
    Further, since the string is now NUL terminated the code only needs to
    change '\n' to '\0' when present.
    
    Cc: stable@vger.kernel.org
    Signed-off-by: default avatarTyrel Datwyler <tyreld@linux.ibm.com>
    [mpe: Reformat change log and add mention of possible stack corruption]
    Signed-off-by: default avatarMichael Ellerman <mpe@ellerman.id.au>
    Link: https://lore.kernel.org/r/20210315214821.452959-1-tyreld@linux.ibm.com
    cc7a0bb0
rpadlpar_sysfs.c 2.49 KB