lists.openwall.net   lists  /  announce  owl-users  owl-dev  john-users  john-dev  passwdqc-users  yescrypt  popa3d-users  /  oss-security  kernel-hardening  musl  sabotage  tlsify  passwords  /  crypt-dev  xvendor  /  Bugtraq  Full-Disclosure  linux-kernel  linux-netdev  linux-ext4  linux-hardening  linux-cve-announce  PHC 
Open Source and information security mailing list archives
 
Hash Suite: Windows password security audit tool. GUI, reports in PDF.
[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <20250919101727.16152-21-farbere@amazon.com>
Date: Fri, 19 Sep 2025 10:17:20 +0000
From: Eliav Farber <farbere@...zon.com>
To: <linux@...linux.org.uk>, <jdike@...toit.com>, <richard@....at>,
	<anton.ivanov@...bridgegreys.com>, <dave.hansen@...ux.intel.com>,
	<luto@...nel.org>, <peterz@...radead.org>, <tglx@...utronix.de>,
	<mingo@...hat.com>, <bp@...en8.de>, <x86@...nel.org>, <hpa@...or.com>,
	<tony.luck@...el.com>, <qiuxu.zhuo@...el.com>, <mchehab@...nel.org>,
	<james.morse@....com>, <rric@...nel.org>, <harry.wentland@....com>,
	<sunpeng.li@....com>, <alexander.deucher@....com>,
	<christian.koenig@....com>, <airlied@...ux.ie>, <daniel@...ll.ch>,
	<evan.quan@....com>, <james.qian.wang@....com>, <liviu.dudau@....com>,
	<mihail.atanassov@....com>, <brian.starkey@....com>,
	<maarten.lankhorst@...ux.intel.com>, <mripard@...nel.org>,
	<tzimmermann@...e.de>, <robdclark@...il.com>, <sean@...rly.run>,
	<jdelvare@...e.com>, <linux@...ck-us.net>, <fery@...ress.com>,
	<dmitry.torokhov@...il.com>, <agk@...hat.com>, <snitzer@...hat.com>,
	<dm-devel@...hat.com>, <rajur@...lsio.com>, <davem@...emloft.net>,
	<kuba@...nel.org>, <peppe.cavallaro@...com>, <alexandre.torgue@...com>,
	<joabreu@...opsys.com>, <mcoquelin.stm32@...il.com>, <malattia@...ux.it>,
	<hdegoede@...hat.com>, <mgross@...ux.intel.com>, <intel-linux-scu@...el.com>,
	<artur.paszkiewicz@...el.com>, <jejb@...ux.ibm.com>,
	<martin.petersen@...cle.com>, <sakari.ailus@...ux.intel.com>,
	<gregkh@...uxfoundation.org>, <clm@...com>, <josef@...icpanda.com>,
	<dsterba@...e.com>, <jack@...e.com>, <tytso@....edu>,
	<adilger.kernel@...ger.ca>, <dushistov@...l.ru>,
	<luc.vanoostenryck@...il.com>, <rostedt@...dmis.org>, <pmladek@...e.com>,
	<sergey.senozhatsky@...il.com>, <andriy.shevchenko@...ux.intel.com>,
	<linux@...musvillemoes.dk>, <minchan@...nel.org>, <ngupta@...are.org>,
	<akpm@...ux-foundation.org>, <kuznet@....inr.ac.ru>,
	<yoshfuji@...ux-ipv6.org>, <pablo@...filter.org>, <kadlec@...filter.org>,
	<fw@...len.de>, <jmaloy@...hat.com>, <ying.xue@...driver.com>,
	<willy@...radead.org>, <farbere@...zon.com>, <sashal@...nel.org>,
	<ruanjinjie@...wei.com>, <David.Laight@...LAB.COM>,
	<herve.codina@...tlin.com>, <Jason@...c4.com>, <bvanassche@....org>,
	<keescook@...omium.org>, <linux-arm-kernel@...ts.infradead.org>,
	<linux-kernel@...r.kernel.org>, <linux-um@...ts.infradead.org>,
	<linux-edac@...r.kernel.org>, <amd-gfx@...ts.freedesktop.org>,
	<dri-devel@...ts.freedesktop.org>, <linux-arm-msm@...r.kernel.org>,
	<freedreno@...ts.freedesktop.org>, <linux-hwmon@...r.kernel.org>,
	<linux-input@...r.kernel.org>, <linux-media@...r.kernel.org>,
	<netdev@...r.kernel.org>, <linux-stm32@...md-mailman.stormreply.com>,
	<platform-driver-x86@...r.kernel.org>, <linux-scsi@...r.kernel.org>,
	<linux-staging@...ts.linux.dev>, <linux-btrfs@...r.kernel.org>,
	<linux-ext4@...r.kernel.org>, <linux-sparse@...r.kernel.org>,
	<linux-mm@...ck.org>, <netfilter-devel@...r.kernel.org>,
	<coreteam@...filter.org>, <tipc-discussion@...ts.sourceforge.net>,
	<stable@...r.kernel.org>
CC: <jonnyc@...zon.com>, Linus Torvalds <torvalds@...ux-foundation.org>,
	"David Laight" <David.Laight@...lab.com>, Arnd Bergmann <arnd@...nel.org>
Subject: [PATCH 20/27 5.10.y] minmax: fix up min3() and max3() too

From: Linus Torvalds <torvalds@...ux-foundation.org>

[ Upstream commit 21b136cc63d2a9ddd60d4699552b69c214b32964 ]

David Laight pointed out that we should deal with the min3() and max3()
mess too, which still does excessive expansion.

And our current macros are actually rather broken.

In particular, the macros did this:

  #define min3(x, y, z) min((typeof(x))min(x, y), z)
  #define max3(x, y, z) max((typeof(x))max(x, y), z)

and that not only is a nested expansion of possibly very complex
arguments with all that involves, the typing with that "typeof()" cast
is completely wrong.

For example, imagine what happens in max3() if 'x' happens to be a
'unsigned char', but 'y' and 'z' are 'unsigned long'.  The types are
compatible, and there's no warning - but the result is just random
garbage.

No, I don't think we've ever hit that issue in practice, but since we
now have sane infrastructure for doing this right, let's just use it.
It fixes any excessive expansion, and also avoids these kinds of broken
type issues.

Requested-by: David Laight <David.Laight@...lab.com>
Acked-by: Arnd Bergmann <arnd@...nel.org>
Signed-off-by: Linus Torvalds <torvalds@...ux-foundation.org>
Signed-off-by: Eliav Farber <farbere@...zon.com>
---
 include/linux/minmax.h | 12 ++++++++++--
 1 file changed, 10 insertions(+), 2 deletions(-)

diff --git a/include/linux/minmax.h b/include/linux/minmax.h
index 41da6f85a407..98008dd92153 100644
--- a/include/linux/minmax.h
+++ b/include/linux/minmax.h
@@ -152,13 +152,20 @@
 #define umax(x, y)	\
 	__careful_cmp(max, (x) + 0u + 0ul + 0ull, (y) + 0u + 0ul + 0ull)
 
+#define __careful_op3(op, x, y, z, ux, uy, uz) ({			\
+	__auto_type ux = (x); __auto_type uy = (y);__auto_type uz = (z);\
+	BUILD_BUG_ON_MSG(!__types_ok3(x,y,z,ux,uy,uz),			\
+		#op"3("#x", "#y", "#z") signedness error");		\
+	__cmp(op, ux, __cmp(op, uy, uz)); })
+
 /**
  * min3 - return minimum of three values
  * @x: first value
  * @y: second value
  * @z: third value
  */
-#define min3(x, y, z) min((typeof(x))min(x, y), z)
+#define min3(x, y, z) \
+	__careful_op3(min, x, y, z, __UNIQUE_ID(x_), __UNIQUE_ID(y_), __UNIQUE_ID(z_))
 
 /**
  * max3 - return maximum of three values
@@ -166,7 +173,8 @@
  * @y: second value
  * @z: third value
  */
-#define max3(x, y, z) max((typeof(x))max(x, y), z)
+#define max3(x, y, z) \
+	__careful_op3(max, x, y, z, __UNIQUE_ID(x_), __UNIQUE_ID(y_), __UNIQUE_ID(z_))
 
 /**
  * min_not_zero - return the minimum that is _not_ zero, unless both are zero
-- 
2.47.3


Powered by blists - more mailing lists

Powered by Openwall GNU/*/Linux Powered by OpenVZ