All of lore.kernel.org
 help / color / mirror / Atom feed
From: David Laight <david.laight.linux@gmail.com>
To: Bart Van Assche <bvanassche@acm.org>
Cc: linux-kernel@vger.kernel.org, linux-scsi@vger.kernel.org,
	"James E.J. Bottomley" <James.Bottomley@HansenPartnership.com>,
	"Martin K. Petersen" <martin.petersen@oracle.com>
Subject: Re: [PATCH 26/44] drivers/scsi: use min() instead of min_t()
Date: Sat, 22 Nov 2025 21:50:23 +0000	[thread overview]
Message-ID: <20251122215023.2fe10a2b@pumpkin> (raw)
In-Reply-To: <2a8c62e1-6e29-4ac6-b661-7b5ec1763288@acm.org>

On Wed, 19 Nov 2025 15:09:02 -0800
Bart Van Assche <bvanassche@acm.org> wrote:

> On 11/19/25 2:41 PM, david.laight.linux@gmail.com wrote:
> > From: David Laight <david.laight.linux@gmail.com>
> > 
> > min_t(unsigned int, a, b) casts an 'unsigned long' to 'unsigned int'.
> > Use min(a, b) instead as it promotes any 'unsigned int' to 'unsigned long'
> > and so cannot discard significant bits.
> > 
> > In this case the 'unsigned long' value is small enough that the result
> > is ok.
> > 
> > Detected by an extra check added to min_t().
> > 
> > Signed-off-by: David Laight <david.laight.linux@gmail.com>
> > ---
> >   drivers/scsi/hosts.c | 2 +-
> >   1 file changed, 1 insertion(+), 1 deletion(-)
> > 
> > diff --git a/drivers/scsi/hosts.c b/drivers/scsi/hosts.c
> > index 17173239301e..b15896560cf6 100644
> > --- a/drivers/scsi/hosts.c
> > +++ b/drivers/scsi/hosts.c
> > @@ -247,7 +247,7 @@ int scsi_add_host_with_dma(struct Scsi_Host *shost, struct device *dev,
> >   	shost->dma_dev = dma_dev;
> >   
> >   	if (dma_dev->dma_mask) {
> > -		shost->max_sectors = min_t(unsigned int, shost->max_sectors,
> > +		shost->max_sectors = min(shost->max_sectors,
> >   				dma_max_mapping_size(dma_dev) >> SECTOR_SHIFT);
> >   	}  
> 
> So instead of the type cast performed by min_t() potentially discarding
> bits, the assignment potentially discards bits. I'm not sure this is an
> improvement.

In this case the assignment is fine - shost->max_sectors is on both sides,
so the value can only go down.

The issue is that dma_max_mapping_size() returns a 64bit value.
So if you have some magic high speed interface with a 2TB 'dma map'
then 'dma_max_mapping_size(dma_dev) >> SECTOR_SHIFT' is '1u << 32' so
is zero when cast to 'unsigned int'.
At that point things start going horribly wrong.

I don't think there are any such interfaces - so the bug this fixes
can't happen.

OTOH the same test does pick up a lot (and I mean a lot [1]) of driver code
that contains code like:
ssize_t do_xxx(...  size_t len)
{
	unsigned int copied = 0, frag_len;
	while (copied < len) {
		frag_len = min_t(unsigned int, len, MAX_FRAG);
		....
		copied += frag_len;
		len -= frag_len;
	}
	return copied;
}

If you manage to request a transfer for 4G (or more) then it doesn't work.
Now there might be a test earlier that stops that happening in a lot of places.
But from the perspective of the function it isn't true.
(I suspect readv() with a single iov[] can generate a big buffer.)
The compile-time test detects that (unsigned int)len may not equal len
and it can be fixed by changing to min(len, MAX_FRAG);
In this case it might be a real bug.

Note that a read can be truncated after a few bytes - it is only the
buffer size that needs to be massive.

	David

[1] I've just built allmodconfig - 'only' 488 more files needed changing.
A fair number of 'real bugs', a few false positives because PAGE_SIZE and
sizeof() are 64bit, and a lot of dubious code.
By far the worst are all the min_t([u8|u16], ...) in many cases the code
uses the type of the destination - so you get (eg):
	u8_var = min(u8, value_32 / 2, 255);

> 
> Thanks,
> 
> Bart.


  parent reply	other threads:[~2025-11-22 21:50 UTC|newest]

Thread overview: 109+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2025-11-19 22:40 [PATCH 00/44] Change a lot of min_t() that might mask high bits david.laight.linux
2025-11-19 22:40 ` [PATCH 01/44] x86/asm/bitops: Change the return type of variable__ffs() to unsigned int david.laight.linux
2025-11-20 15:54   ` Yury Norov
2025-11-20 18:29     ` David Laight
2025-11-20 18:33       ` Yury Norov
2025-11-20 21:18         ` David Laight
2025-11-24 14:58           ` Yury Norov
2025-11-24 18:18             ` David Laight
2025-11-19 22:40 ` [PATCH 02/44] ext4: Fix saturation of 64bit inode times for old filesystems david.laight.linux
2025-11-19 22:40 ` [PATCH 03/44] perf: Fix branch stack callchain limit david.laight.linux
2025-11-26  5:25   ` Mi, Dapeng
2025-11-19 22:41 ` [PATCH 04/44] io_uring/net: Change some dubious min_t() david.laight.linux
2025-11-20 14:48   ` Jens Axboe
2025-11-20 15:48     ` David Laight
2025-11-20 15:53       ` Jens Axboe
2025-11-22 11:31         ` David Laight
2025-11-19 22:41 ` [PATCH 05/44] ipc/msg: Fix saturation of percpu counts in msgctl_info() david.laight.linux
2025-11-19 22:41 ` [PATCH 06/44] bpf: Verifier, remove some unusual uses of min_t() and max_t() david.laight.linux
2025-11-21 21:40   ` Alexei Starovoitov
2025-11-21 22:21     ` David Laight
2025-11-23 16:39       ` Alexei Starovoitov
2025-11-23 18:07         ` David Laight
2025-11-23 19:20           ` Alexei Starovoitov
2025-11-23 23:03             ` David Laight
2025-11-19 22:41 ` [PATCH 07/44] net/core/flow_dissector: Fix cap of __skb_flow_dissect() return value david.laight.linux
2025-11-19 22:41 ` [PATCH 08/44] net: ethtool: Use min3() instead of nested min_t(u16,...) david.laight.linux
2025-11-19 22:41 ` [PATCH 09/44] ipv6: __ip6_append_data() don't abuse max_t() casts david.laight.linux
2025-11-20  0:32   ` bot+bpf-ci
2025-11-20 11:16     ` David Laight
2025-11-20 13:50       ` Chris Mason
2025-11-19 22:41 ` [PATCH 10/44] x86/crypto: ctr_crypt() use min() instead of min_t() david.laight.linux
2025-11-19 22:41 ` [PATCH 11/44] arch/x96/kvm: " david.laight.linux
2025-11-19 22:41 ` [PATCH 12/44] block: " david.laight.linux
2025-11-20 14:44   ` Jens Axboe
2025-11-19 22:41 ` [PATCH 13/44] drivers/acpi: " david.laight.linux
2025-11-24 19:48   ` Rafael J. Wysocki
2025-11-19 22:41 ` [PATCH 14/44] drivers/char/hw_random: use min3() instead of nested min_t() david.laight.linux
2025-11-19 22:41 ` [PATCH 15/44] drivers/char/tpm: use min() instead of min_t() david.laight.linux
2025-11-21 20:11   ` Jarkko Sakkinen
2025-11-19 22:41 ` [PATCH 16/44] drivers/crypto/ccp: " david.laight.linux
2025-11-19 22:41 ` [PATCH 17/44] drivers/cxl: " david.laight.linux
2025-11-19 23:50   ` Dave Jiang
2025-11-19 22:41 ` [PATCH 18/44] drivers/gpio: " david.laight.linux
2025-11-20  8:01   ` Andy Shevchenko
2025-11-20  9:37     ` David Laight
2025-11-25  9:55       ` Andy Shevchenko
2025-11-19 22:41 ` [PATCH 19/44] drivers/gpu/drm/amd: " david.laight.linux
2025-11-19 22:41 ` [PATCH 20/44] drivers/i2c/busses: " david.laight.linux
2026-01-20 13:19   ` Andi Shyti
2025-11-19 22:41 ` [PATCH 21/44] drivers/net/ethernet/realtek: " david.laight.linux
2025-11-19 22:41 ` [PATCH 22/44] drivers/nvme: " david.laight.linux
2025-11-19 22:41 ` [PATCH 23/44] arch/x86/mm: " david.laight.linux
2025-11-19 22:41 ` [PATCH 24/44] drivers/nvmem: " david.laight.linux
2025-11-19 22:41 ` [PATCH 25/44] drivers/pci: " david.laight.linux
2025-11-24 21:04   ` Bjorn Helgaas
2025-11-24 21:42     ` David Laight
2025-11-19 22:41 ` [PATCH 26/44] drivers/scsi: " david.laight.linux
2025-11-19 23:09   ` Bart Van Assche
2025-11-20 18:44     ` David Laight
2025-11-22 21:50     ` David Laight [this message]
2025-11-19 22:41 ` [PATCH 27/44] drivers/tty/vt: use umin() instead of min_t(u16, ...) for row/col limits david.laight.linux
2025-11-20  7:23   ` Jiri Slaby
2025-11-19 22:41 ` [PATCH 28/44] drivers/usb/storage: use min() instead of min_t() david.laight.linux
2025-11-20  2:59   ` Alan Stern
2025-11-20  9:18     ` David Laight
2025-11-20 14:39       ` [usb-storage] " Alan Stern
2025-11-19 22:41 ` [PATCH 29/44] drivers/xen: " david.laight.linux
2025-11-20  8:13   ` Jürgen Groß
2025-11-19 22:41 ` [PATCH 30/44] fs: use min() or umin() " david.laight.linux
2025-11-25  9:06   ` Christian Brauner
2026-01-12 21:51   ` Brian Masney
2026-01-13  9:42     ` David Laight
2026-01-13 16:56   ` Mark Brown
2026-01-13 18:33     ` David Laight
2026-01-13 19:10       ` Mark Brown
2026-01-13 19:24       ` David Laight
2025-11-19 22:41 ` [PATCH 31/44] block: bvec.h: use min() " david.laight.linux
2025-11-19 22:41 ` [PATCH 32/44] nodemask: " david.laight.linux
2025-11-20 15:19   ` Yury Norov
2025-11-19 22:41 ` [PATCH 33/44] ipc: " david.laight.linux
2025-11-19 22:41 ` [PATCH 34/44] bpf: " david.laight.linux
2025-11-19 22:41 ` [PATCH 35/44] " david.laight.linux
2025-11-19 22:41 ` [PATCH 36/44] lib/bucket_locks: " david.laight.linux
2025-11-19 22:41 ` [PATCH 37/44] lib/crypto/mpi: " david.laight.linux
2025-11-19 22:41 ` [PATCH 38/44] lib/dynamic_queue_limits: use max() instead of max_t() david.laight.linux
2025-11-19 22:41 ` [PATCH 39/44] mm: use min() instead of min_t() david.laight.linux
2025-11-20  9:20   ` David Hildenbrand (Red Hat)
2025-11-20  9:59     ` David Laight
2025-11-20 23:45       ` Eric Biggers
2025-11-21  8:27         ` David Hildenbrand (Red Hat)
2025-11-21  9:15         ` David Laight
2025-11-20 10:36   ` Lorenzo Stoakes
2025-11-20 12:09     ` Lorenzo Stoakes
2025-11-20 12:55     ` David Laight
2025-11-20 13:42       ` David Hildenbrand (Red Hat)
2025-11-20 15:44         ` David Laight
2025-11-21  8:24           ` David Hildenbrand (Red Hat)
2025-11-19 22:41 ` [PATCH 40/44] net: Don't pass bitfields to max_t() david.laight.linux
2025-11-19 22:41 ` [PATCH 41/44] net/core: Change loop conditions so min() can be used david.laight.linux
2025-11-19 22:41 ` [PATCH 42/44] net: use min() instead of min_t() david.laight.linux
2025-11-19 22:41 ` [PATCH 43/44] net/netlink: Use umin() to avoid min_t(int, ...) discarding high bits david.laight.linux
2025-11-19 22:41 ` [PATCH 44/44] net/mptcp: Change some dubious min_t(int, ...) to min() david.laight.linux
2025-12-18 17:33   ` Matthieu Baerts
2025-12-18 20:15     ` David Laight
2025-12-19 10:48       ` Matthieu Baerts
2025-11-20  1:47 ` [PATCH 00/44] Change a lot of min_t() that might mask high bits Jakub Kicinski
2025-11-20  9:38 ` Lorenzo Stoakes
2025-11-20 14:52 ` (subset) " Jens Axboe
2025-11-24  9:49 ` Herbert Xu

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=20251122215023.2fe10a2b@pumpkin \
    --to=david.laight.linux@gmail.com \
    --cc=James.Bottomley@HansenPartnership.com \
    --cc=bvanassche@acm.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-scsi@vger.kernel.org \
    --cc=martin.petersen@oracle.com \
    /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.