[rtems commit] Remove potential identifier conflict in the EV_SET macro.

Sebastian Huber sebh at rtems.org
Wed Aug 8 06:49:37 UTC 2018


Module:    rtems
Branch:    master
Commit:    b37ef68873b5dbc2f284dd874b0ee99b11841c4d
Changeset: http://git.rtems.org/rtems/commit/?id=b37ef68873b5dbc2f284dd874b0ee99b11841c4d

Author:    dab <dab at FreeBSD.org>
Date:      Thu Jun 28 17:01:04 2018 +0000

Remove potential identifier conflict in the EV_SET macro.

PR43905 pointed out a problem with the EV_SET macro if the passed
struct kevent pointer were specified with an expression with side
effects (e.g., "kevp++"). This was fixed in rS110241, but by using a
local block that defined an internal variable (named "kevp") to get
the pointer value once. This worked, but could cause issues if an
existing variable named "kevp" is in scope. To avoid that issue,
jilles@ pointed out that "C99 compound literals and designated
initializers allow doing this cleanly using a macro". This change
incorporates that suggestion, essentially verbatim from jilles@
comment on PR43905, except retaining the old definition for pre-C99 or
non-STDC (e.g., C++) compilers.

PR:	43905
Submitted by:	Jilles Tjoelker (jilles@)
Reported by:	Lamont Granquist <lamont at scriptkiddie.org>
Reviewed by:	jmg (no comments), jilles
MFC after:	1 week
Sponsored by:	Dell EMC
Differential Revision:	https://bugs.freebsd.org/bugzilla/show_bug.cgi?id=43905

---

 cpukit/include/sys/event.h | 20 ++++++++++++++++++++
 1 file changed, 20 insertions(+)

diff --git a/cpukit/include/sys/event.h b/cpukit/include/sys/event.h
index 92f4f57..b3ba98d 100644
--- a/cpukit/include/sys/event.h
+++ b/cpukit/include/sys/event.h
@@ -49,6 +49,25 @@
 #define EVFILT_EMPTY		(-13)	/* empty send socket buf */
 #define EVFILT_SYSCOUNT		13
 
+#if defined(__STDC_VERSION__) && __STDC_VERSION__ >= 199901L
+#define EV_SET(kevp_, a, b, c, d, e, f) do {	\
+    *(kevp_) = (struct kevent){			\
+	.ident = (a),				\
+	.filter = (b),				\
+	.flags = (c),				\
+	.fflags = (d),				\
+	.data = (e),				\
+	.udata = (f),				\
+	.ext[0] = 0,				\
+	.ext[1] = 0,				\
+	.ext[2] = 0,				\
+	.ext[3] = 0,				\
+    };						\
+} while(0)
+#else /* Pre-C99 or not STDC (e.g., C++) */
+/* The definition of the local variable kevp could possibly conflict
+ * with a user-defined value passed in parameters a-f.
+ */
 #define EV_SET(kevp_, a, b, c, d, e, f) do {	\
 	struct kevent *kevp = (kevp_);		\
 	(kevp)->ident = (a);			\
@@ -62,6 +81,7 @@
 	(kevp)->ext[2] = 0;			\
 	(kevp)->ext[3] = 0;			\
 } while(0)
+#endif
 
 struct kevent {
 	__uintptr_t	ident;		/* identifier for this event */



More information about the vc mailing list