]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
mmc: omap_hsmmc: fix busy_timeout overflow in ns conversion on 32-bit
authorZhan Xusheng <zhanxusheng1024@gmail.com>
Tue, 4 Aug 2026 02:25:00 +0000 (10:25 +0800)
committerUlf Hansson <ulfh@kernel.org>
Tue, 4 Aug 2026 13:39:11 +0000 (15:39 +0200)
omap_hsmmc_prepare_data() converts the command busy timeout to nanoseconds
with:

timeout = req->cmd->busy_timeout * NSEC_PER_MSEC;

busy_timeout is an unsigned int (milliseconds) and timeout is a u64, but
NSEC_PER_MSEC is 1000000L.  On 32-bit builds the multiplication is
performed in 32-bit arithmetic and wraps for busy_timeout values above
~4294 ms, before the result is assigned to the u64.

The driver does not set mmc->max_busy_timeout, so the core does not cap the
busy timeout, and commands such as erase or SANITIZE (MMC_SANITIZE_TIMEOUT_MS
is 240000 ms) can pass a busy_timeout far larger than 4294 ms.  The wrapped,
much smaller ns value is then programmed via set_data_timeout(), so the data
timeout is set too short and the operation can time out prematurely.

Cast busy_timeout to u64 before the multiplication so the conversion is done
in 64-bit arithmetic.

Fixes: 8cc9a3e73de1 ("mmc: host: omap_hsmmc: use generic_cmd6_time to program timeout value for CMD6")
Cc: stable@vger.kernel.org
Signed-off-by: Zhan Xusheng <zhanxusheng@xiaomi.com>
Signed-off-by: Ulf Hansson <ulfh@kernel.org>
drivers/mmc/host/omap_hsmmc.c

index 58c881f2725b1346fb44498ef74fa6812abdcf2a..3356ac5a1fa0861ca5413dfd5811bf83d444aac7 100644 (file)
@@ -1357,7 +1357,7 @@ omap_hsmmc_prepare_data(struct omap_hsmmc_host *host, struct mmc_request *req)
        if (req->data == NULL) {
                OMAP_HSMMC_WRITE(host->base, BLK, 0);
                if (req->cmd->flags & MMC_RSP_BUSY) {
-                       timeout = req->cmd->busy_timeout * NSEC_PER_MSEC;
+                       timeout = (u64)req->cmd->busy_timeout * NSEC_PER_MSEC;
 
                        /*
                         * Set an arbitrary 100ms data timeout for commands with