Author: dab
Date: Thu Jun 28 17:01:04 2018
New Revision: 335765
URL: https://svnweb.freebsd.org/changeset/base/335765

Log:
  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 <lam...@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

Modified:
  head/sys/sys/event.h

Modified: head/sys/sys/event.h
==============================================================================
--- head/sys/sys/event.h        Thu Jun 28 15:30:51 2018        (r335764)
+++ head/sys/sys/event.h        Thu Jun 28 17:01:04 2018        (r335765)
@@ -49,7 +49,26 @@
 #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);                    \
        (kevp)->filter = (b);                   \
@@ -62,6 +81,7 @@
        (kevp)->ext[2] = 0;                     \
        (kevp)->ext[3] = 0;                     \
 } while(0)
+#endif
 
 struct kevent {
        __uintptr_t     ident;          /* identifier for this event */
_______________________________________________
svn-src-all@freebsd.org mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"

Reply via email to