public inbox for linux-kernel@vger.kernel.org
 help / color / mirror / Atom feed
* [PATCH 1/4] container_of: add container_of_const() that preserves const-ness of the pointer
@ 2022-12-01 19:30 Greg Kroah-Hartman
  2022-12-01 19:30 ` [PATCH 2/4] device.h: move kobj_to_dev() to use container_of_const() Greg Kroah-Hartman
                   ` (6 more replies)
  0 siblings, 7 replies; 14+ messages in thread
From: Greg Kroah-Hartman @ 2022-12-01 19:30 UTC (permalink / raw)
  To: linux-kernel
  Cc: Greg Kroah-Hartman, Jason Gunthorpe, Matthew Wilcox, Sakari Ailus,
	Andy Shevchenko, Rafael J. Wysocki

container_of does not preserve the const-ness of a pointer that is
passed into it, which can cause C code that passes in a const pointer to
get a pointer back that is not const and then scribble all over the data
in it.  To prevent this, container_of_const() will preserve the const
status of the pointer passed into it using the newly available _Generic()
method.

Co-developed-by: Jason Gunthorpe <jgg@ziepe.ca>
Cc: Matthew Wilcox <willy@infradead.org>
Cc: Sakari Ailus <sakari.ailus@linux.intel.com>
Cc: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
Cc: "Rafael J. Wysocki" <rafael@kernel.org>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
---
 include/linux/container_of.h | 14 ++++++++++++++
 1 file changed, 14 insertions(+)

diff --git a/include/linux/container_of.h b/include/linux/container_of.h
index 2008e9f4058c..3c290e865151 100644
--- a/include/linux/container_of.h
+++ b/include/linux/container_of.h
@@ -22,4 +22,18 @@
 		      "pointer type mismatch in container_of()");	\
 	((type *)(__mptr - offsetof(type, member))); })
 
+/**
+ * container_of_const - cast a member of a structure out to the containing
+ *			structure and preserve the const-ness of the pointer
+ * @ptr_type:		the type of the pointer @ptr
+ * @ptr:		the pointer to the member
+ * @member_type:	the type of the container struct this is embedded in.
+ * @member:		the name of the member within the struct.
+ */
+#define container_of_const(ptr_type, ptr, member_type, member)		\
+	_Generic(ptr,							\
+		const ptr_type *: ((const member_type *)container_of(ptr, member_type, member)),\
+		ptr_type *: ((member_type *)container_of(ptr, member_type, member))	\
+	)
+
 #endif	/* _LINUX_CONTAINER_OF_H */
-- 
2.38.1


^ permalink raw reply related	[flat|nested] 14+ messages in thread

end of thread, other threads:[~2022-12-02 16:25 UTC | newest]

Thread overview: 14+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2022-12-01 19:30 [PATCH 1/4] container_of: add container_of_const() that preserves const-ness of the pointer Greg Kroah-Hartman
2022-12-01 19:30 ` [PATCH 2/4] device.h: move kobj_to_dev() to use container_of_const() Greg Kroah-Hartman
2022-12-01 19:30 ` [PATCH 3/4] usb.h: take advantage of container_of_const() Greg Kroah-Hartman
2022-12-01 19:30 ` [PATCH 4/4] firmware_loader: fix up to_fw_sysfs() to preserve const Greg Kroah-Hartman
2022-12-01 20:25   ` Russ Weight
2022-12-01 22:50 ` [PATCH 1/4] container_of: add container_of_const() that preserves const-ness of the pointer Andy Shevchenko
2022-12-02  0:46   ` Jason Gunthorpe
2022-12-02  6:41     ` Greg Kroah-Hartman
2022-12-01 23:21 ` Sakari Ailus
2022-12-02 10:45   ` Greg Kroah-Hartman
2022-12-02 12:01     ` Andy Shevchenko
2022-12-02  0:48 ` Jason Gunthorpe
2022-12-02 12:48 ` Sakari Ailus
2022-12-02 16:24   ` Greg Kroah-Hartman

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox