• Tobias Stoeckmann's avatar
    Fixed off-by-one writes (CVE-2018-14599). · b469da14
    Tobias Stoeckmann authored and Matthieu Herrb's avatar Matthieu Herrb committed
    The functions XGetFontPath, XListExtensions, and XListFonts are
    vulnerable to an off-by-one override on malicious server responses.
    The server replies consist of chunks consisting of a length byte
    followed by actual string, which is not NUL-terminated.
    While parsing the response, the length byte is overridden with '\0',
    thus the memory area can be used as storage of C strings later on. To
    be able to NUL-terminate the last string, the buffer is reserved with
    an additional byte of space.
    For a boundary check, the variable chend (end of ch) was introduced,
    pointing at the end of the buffer which ch initially points to.
    Unfortunately there is a difference in handling "the end of ch".
    While chend points at the first byte that must not be written to,
    the for-loop uses chend as the last byte that can be written to.
    Therefore, an off-by-one can occur.
    I have refactored the code so chend actually points to the last byte
    that can be written to without an out of boundary access. As it is not
    possible to achieve "ch + length < chend" and "ch + length + 1 > chend"
    with the corrected chend meaning, I removed the inner if-check.
    Signed-off-by: Tobias Stoeckmann's avatarTobias Stoeckmann <tobias@stoeckmann.org>