Skip site navigation (1)Skip section navigation (2)
Date:      Wed, 11 Jul 2018 14:50:07 +0000 (UTC)
From:      David Bright <dab@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-stable@freebsd.org, svn-src-stable-11@freebsd.org
Subject:   svn commit: r336198 - stable/11/sys/sys
Message-ID:  <201807111450.w6BEo7iZ052198@repo.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: dab
Date: Wed Jul 11 14:50:06 2018
New Revision: 336198
URL: https://svnweb.freebsd.org/changeset/base/336198

Log:
  MFC r335765, r335776, r336186:
  
  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@scriptkiddie.org>
  Sponsored by:	Dell EMC

Modified:
  stable/11/sys/sys/event.h
Directory Properties:
  stable/11/   (props changed)

Modified: stable/11/sys/sys/event.h
==============================================================================
--- stable/11/sys/sys/event.h	Wed Jul 11 13:53:44 2018	(r336197)
+++ stable/11/sys/sys/event.h	Wed Jul 11 14:50:06 2018	(r336198)
@@ -45,6 +45,21 @@
 #define EVFILT_SENDFILE		(-12)	/* attached to sendfile requests */
 #define EVFILT_SYSCOUNT		12
 
+#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),			\
+	};					\
+} 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);			\
@@ -54,6 +69,7 @@
 	(kevp)->data = (e);			\
 	(kevp)->udata = (f);			\
 } while(0)
+#endif
 
 struct kevent {
 	uintptr_t	ident;		/* identifier for this event */



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201807111450.w6BEo7iZ052198>