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]
Date:   Thu, 13 Oct 2022 14:55:42 +0200
From:   Jiri Pirko <jiri@...nulli.us>
To:     ecree@...inx.com
Cc:     netdev@...r.kernel.org, linux-net-drivers@....com,
        davem@...emloft.net, kuba@...nel.org, pabeni@...hat.com,
        edumazet@...gle.com, habetsm.xilinx@...il.com,
        johannes@...solutions.net, marcelo.leitner@...il.com,
        Edward Cree <ecree.xilinx@...il.com>
Subject: Re: [RFC PATCH net-next 1/3] netlink: add support for formatted
 extack messages

Fri, Oct 07, 2022 at 03:25:12PM CEST, ecree@...inx.com wrote:
>From: Edward Cree <ecree.xilinx@...il.com>
>
>Include an 80-byte buffer in struct netlink_ext_ack that can be used
> for scnprintf()ed messages.  This does mean that the resulting string
> can't be enumerated, translated etc. in the way NL_SET_ERR_MSG() was
> designed to allow.
>
>Signed-off-by: Edward Cree <ecree.xilinx@...il.com>
>---
> include/linux/netlink.h | 21 +++++++++++++++++++--
> 1 file changed, 19 insertions(+), 2 deletions(-)
>
>diff --git a/include/linux/netlink.h b/include/linux/netlink.h
>index d51e041d2242..bfab9dbd64fa 100644
>--- a/include/linux/netlink.h
>+++ b/include/linux/netlink.h
>@@ -64,6 +64,7 @@ netlink_kernel_create(struct net *net, int unit, struct netlink_kernel_cfg *cfg)
> 
> /* this can be increased when necessary - don't expose to userland */
> #define NETLINK_MAX_COOKIE_LEN	20
>+#define NETLINK_MAX_FMTMSG_LEN	80
> 
> /**
>  * struct netlink_ext_ack - netlink extended ACK report struct
>@@ -75,6 +76,8 @@ netlink_kernel_create(struct net *net, int unit, struct netlink_kernel_cfg *cfg)
>  * @miss_nest: nest missing an attribute (%NULL if missing top level attr)
>  * @cookie: cookie data to return to userspace (for success)
>  * @cookie_len: actual cookie data length
>+ * @_msg_buf: output buffer for formatted message strings - don't access
>+ *	directly, use %NL_SET_ERR_MSG_FMT
>  */
> struct netlink_ext_ack {
> 	const char *_msg;
>@@ -84,13 +87,13 @@ struct netlink_ext_ack {
> 	u16 miss_type;
> 	u8 cookie[NETLINK_MAX_COOKIE_LEN];
> 	u8 cookie_len;
>+	char _msg_buf[NETLINK_MAX_FMTMSG_LEN];
> };
> 
> /* Always use this macro, this allows later putting the
>  * message into a separate section or such for things
>  * like translation or listing all possible messages.
>- * Currently string formatting is not supported (due
>- * to the lack of an output buffer.)
>+ * If string formatting is needed use NL_SET_ERR_MSG_FMT.
>  */
> #define NL_SET_ERR_MSG(extack, msg) do {		\
> 	static const char __msg[] = msg;		\
>@@ -102,9 +105,23 @@ struct netlink_ext_ack {
> 		__extack->_msg = __msg;			\
> } while (0)
> 
>+#define NL_SET_ERR_MSG_FMT(extack, fmt, args...) do {		\
>+	struct netlink_ext_ack *__extack = (extack);		\
>+								\
>+	scnprintf(__extack->_msg_buf, NETLINK_MAX_FMTMSG_LEN,	\
>+		  (fmt), ##args);				\
>+	do_trace_netlink_extack(__extack->_msg_buf);		\
>+								\
>+	if (__extack)						\
>+		__extack->_msg = __extack->_msg_buf;		\
>+} while (0)
>+
> #define NL_SET_ERR_MSG_MOD(extack, msg)			\
> 	NL_SET_ERR_MSG((extack), KBUILD_MODNAME ": " msg)
> 
>+#define NL_SET_ERR_MSG_FMT_MOD(extack, fmt, args...)	\

I wonder, wouldn't it be better to just have NL_SET_ERR_MSG_MOD which
accepts format string and that's it. I understand there is an extra
overhead for the messages that don't use formatting, but do we care?
This is no fastpath and usually happens only seldom. The API towards
the driver would be more simple.

I like this a lot!


>+	NL_SET_ERR_MSG_FMT((extack), KBUILD_MODNAME ": " fmt, ##args)
>+
> #define NL_SET_BAD_ATTR_POLICY(extack, attr, pol) do {	\
> 	if ((extack)) {					\
> 		(extack)->bad_attr = (attr);		\

Powered by blists - more mailing lists

Powered by Openwall GNU/*/Linux Powered by OpenVZ