• M
    of: Fix modalias string generation · 56ce204e
    Miquel Raynal 提交于
    stable inclusion
    from stable-v4.19.283
    commit d72e2dc104e65827798e116f9e4853b85488d3e8
    category: bugfix
    bugzilla: https://gitee.com/openeuler/kernel/issues/I7BZ5U
    CVE: NA
    
    --------------------------------
    
    [ Upstream commit b19a4266 ]
    
    The helper generating an OF based modalias (of_device_get_modalias())
    works fine, but due to the use of snprintf() internally it needs a
    buffer one byte longer than what should be needed just for the entire
    string (excluding the '\0'). Most users of this helper are sysfs hooks
    providing the modalias string to users. They all provide a PAGE_SIZE
    buffer which is way above the number of bytes required to fit the
    modalias string and hence do not suffer from this issue.
    
    There is another user though, of_device_request_module(), which is only
    called by drivers/usb/common/ulpi.c. This request module function is
    faulty, but maybe because in most cases there is an alternative, ULPI
    driver users have not noticed it.
    
    In this function, of_device_get_modalias() is called twice. The first
    time without buffer just to get the number of bytes required by the
    modalias string (excluding the null byte), and a second time, after
    buffer allocation, to fill the buffer. The allocation asks for an
    additional byte, in order to store the trailing '\0'. However, the
    buffer *length* provided to of_device_get_modalias() excludes this extra
    byte. The internal use of snprintf() with a length that is exactly the
    number of bytes to be written has the effect of using the last available
    byte to store a '\0', which then smashes the last character of the
    modalias string.
    
    Provide the actual size of the buffer to of_device_get_modalias() to fix
    this issue.
    
    Note: the "str[size - 1] = '\0';" line is not really needed as snprintf
    will anyway end the string with a null byte, but there is a possibility
    that this function might be called on a struct device_node without
    compatible, in this case snprintf() would not be executed. So we keep it
    just to avoid possible unbounded strings.
    
    Cc: Stephen Boyd <sboyd@kernel.org>
    Cc: Peter Chen <peter.chen@kernel.org>
    Fixes: 9c829c09 ("of: device: Support loading a module with OF based modalias")
    Signed-off-by: NMiquel Raynal <miquel.raynal@bootlin.com>
    Reviewed-by: NRob Herring <robh@kernel.org>
    Signed-off-by: NSrinivas Kandagatla <srinivas.kandagatla@linaro.org>
    Link: https://lore.kernel.org/r/20230404172148.82422-2-srinivas.kandagatla@linaro.orgSigned-off-by: NGreg Kroah-Hartman <gregkh@linuxfoundation.org>
    Signed-off-by: NSasha Levin <sashal@kernel.org>
    Signed-off-by: NYongqiang Liu <liuyongqiang13@huawei.com>
    56ce204e
device.c 8.6 KB