From: sashiko-bot@kernel.org
To: "Rosen Penev" <rosenp@gmail.com>
Cc: linux-ide@vger.kernel.org, dlemoal@kernel.org, cassel@kernel.org
Subject: Re: [PATCH] ata: pata_ep93xx: fix double free and ERR_PTR dereference on DMA error path
Date: Mon, 01 Jun 2026 18:44:09 +0000 [thread overview]
Message-ID: <20260601184409.C1CF21F00893@smtp.kernel.org> (raw)
In-Reply-To: <20260601183359.11343-1-rosenp@gmail.com>
Thank you for your contribution! Sashiko AI review found 2 potential issue(s) to consider:
Pre-existing issues:
- [High] The PATA driver fails to initialize if DMA channels are not available, breaking the PIO-only fallback mode.
- [High] Trailing byte transfer logic in PIO data transfer truncates 16-bit values, leading to data corruption on big-endian systems.
--
commit 01fbd237d0698dff8591ae6c458732b482391c35
Author: Rosen Penev <rosenp@gmail.com>
ata: pata_ep93xx: fix double free and ERR_PTR dereference on DMA error path
This commit fixes a double free of the rx channel and an invalid pointer
dereference of the tx channel on the DMA initialization error path. By
NULLing the tx channel before calling the release function, the cleanup
is handled correctly.
> diff --git a/drivers/ata/pata_ep93xx.c b/drivers/ata/pata_ep93xx.c
> index b2b9e0058333e..aa6f8172925d5 100644
> --- a/drivers/ata/pata_ep93xx.c
> +++ b/drivers/ata/pata_ep93xx.c
> @@ -688,7 +688,7 @@ static int ep93xx_pata_dma_init(struct ep93xx_pata_data *drv_data)
> return 0;
>
> fail_release_rx:
> - dma_release_channel(drv_data->dma_rx_channel);
> + drv_data->dma_tx_channel = NULL;
[Severity: High]
This isn't a bug introduced by this patch, but since we are modifying the
error paths in ep93xx_pata_dma_init(), does this initialization failure
unintentionally break the PIO-only fallback?
Looking at the start of ep93xx_pata_dma_init(), if dma_request_chan()
returns -ENODEV because no DMA channels are available in the device tree:
drv_data->dma_rx_channel = dma_request_chan(dev, "rx");
if (IS_ERR(drv_data->dma_rx_channel))
return dev_err_probe(dev, PTR_ERR(drv_data->dma_rx_channel),
"rx DMA setup failed\n");
This error propagates directly back to ep93xx_pata_probe():
err = ep93xx_pata_dma_init(drv_data);
if (err)
return err;
Does this abort the probe entirely on systems without DMA, rather than cleanly
dropping DMA support and allowing the driver to fall back to PIO mode?
> fail_release_dma:
> ep93xx_pata_release_dma(drv_data);
>
[Severity: High]
This is a pre-existing issue, but could the trailing byte transfer logic in
ep93xx_pata_data_xfer() truncate 16-bit values and cause data corruption on
big-endian systems?
In ep93xx_pata_data_xfer(), the pad variable is an array of 2 bytes:
unsigned char pad[2] = { };
On the READ path, a 16-bit value is assigned directly to *pad:
if (rw == READ) {
*pad = cpu_to_le16(
ep93xx_pata_read_data(
drv_data, IDECTRL_ADDR_DATA));
*buf = pad[0];
Doesn't this truncate the 16-bit integer to its lowest 8 bits? On a
little-endian CPU this evaluates to the correct first byte, but on a
big-endian CPU, cpu_to_le16() places the first byte into the upper 8 bits,
which are lost during truncation.
Similarly, on the WRITE path:
} else {
pad[0] = *buf;
ep93xx_pata_write_data(drv_data, le16_to_cpu(*pad),
IDECTRL_ADDR_DATA);
}
Will le16_to_cpu(*pad) zero-extend the 8-bit pad[0] value to a 16-bit
integer, resulting in 0x00BB instead of 0xBB00 before byte swapping,
ultimately writing 0x00 as the first byte of the transfer? Would casting
to a 16-bit pointer better manage memory across endianness boundaries here?
--
Sashiko AI review · https://sashiko.dev/#/patchset/20260601183359.11343-1-rosenp@gmail.com?part=1
next prev parent reply other threads:[~2026-06-01 18:44 UTC|newest]
Thread overview: 3+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-06-01 18:33 [PATCH] ata: pata_ep93xx: fix double free and ERR_PTR dereference on DMA error path Rosen Penev
2026-06-01 18:44 ` sashiko-bot [this message]
2026-06-01 19:05 ` Rosen Penev
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20260601184409.C1CF21F00893@smtp.kernel.org \
--to=sashiko-bot@kernel.org \
--cc=cassel@kernel.org \
--cc=dlemoal@kernel.org \
--cc=linux-ide@vger.kernel.org \
--cc=rosenp@gmail.com \
--cc=sashiko-reviews@lists.linux.dev \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.