[Xorg-commit] xc/include Xpoll.h,1.1.1.1,1.2

Alexander Gottwald xorg-commit at pdx.freedesktop.org
Wed May 9 17:30:30 EEST 2007


Committed by: ago

Update of /cvs/xorg/xc/include
In directory pdx:/tmp/cvs-serv7383

Modified Files:
	Xpoll.h 
Log Message:
- replace the XFD_*SET macros with versions which honour the FD_SETSIZE macro.
  The old ones had buffer overflows if used on cygwin.


Index: Xpoll.h
===================================================================
RCS file: /cvs/xorg/xc/include/Xpoll.h,v
retrieving revision 1.1.1.1
retrieving revision 1.2
diff -u -d -r1.1.1.1 -r1.2
--- Xpoll.h	14 Nov 2003 16:48:42 -0000	1.1.1.1
+++ Xpoll.h	3 Feb 2004 20:52:47 -0000	1.2
@@ -118,62 +118,40 @@
 #endif
 
 /*
- * The following macros are used by the servers only. There is an
- * explicit assumption that the bit array in the fd_set is at least
- * 256 bits long (8 32-bit words). This is true on most modern POSIX 
- * systems. Note that this is merely an optimization for the servers
- * based on assumptions about the way that file descripters are
- * allocated on POSIX systems. 
- *
- * When porting X to new systems it is important to adjust these
- * macros if the system has fewer than 256 bits in the fd_set bit
- * array.
+ * The howmany(FD_SETSIZE, NFDBITS) computes the number of elements in the
+ * array. before accessing an element in the array we check it exists.
+ * If it does not exist then the compiler discards the code to access it. 
  */
 #define XFD_ANYSET(p) \
-		((p)->fds_bits[0] || (p)->fds_bits[1] || \
-		(p)->fds_bits[2] || (p)->fds_bits[3] || \
-		(p)->fds_bits[4] || (p)->fds_bits[5] || \
-		(p)->fds_bits[6] || (p)->fds_bits[7])
-
-#define XFD_COPYSET(src,dst) \
-		(dst)->fds_bits[0] = (src)->fds_bits[0]; \
-		(dst)->fds_bits[1] = (src)->fds_bits[1]; \
-		(dst)->fds_bits[2] = (src)->fds_bits[2]; \
-		(dst)->fds_bits[3] = (src)->fds_bits[3]; \
-		(dst)->fds_bits[4] = (src)->fds_bits[4]; \
-		(dst)->fds_bits[5] = (src)->fds_bits[5]; \
-		(dst)->fds_bits[6] = (src)->fds_bits[6]; \
-		(dst)->fds_bits[7] = (src)->fds_bits[7];
-
-#define XFD_ANDSET(dst,b1,b2) \
-		(dst)->fds_bits[0] = ((b1)->fds_bits[0] & (b2)->fds_bits[0]); \
-		(dst)->fds_bits[1] = ((b1)->fds_bits[1] & (b2)->fds_bits[1]); \
-		(dst)->fds_bits[2] = ((b1)->fds_bits[2] & (b2)->fds_bits[2]); \
-		(dst)->fds_bits[3] = ((b1)->fds_bits[3] & (b2)->fds_bits[3]); \
-		(dst)->fds_bits[4] = ((b1)->fds_bits[4] & (b2)->fds_bits[4]); \
-		(dst)->fds_bits[5] = ((b1)->fds_bits[5] & (b2)->fds_bits[5]); \
-		(dst)->fds_bits[6] = ((b1)->fds_bits[6] & (b2)->fds_bits[6]); \
-		(dst)->fds_bits[7] = ((b1)->fds_bits[7] & (b2)->fds_bits[7]);
-
-#define XFD_ORSET(dst,b1,b2) \
-		(dst)->fds_bits[0] = ((b1)->fds_bits[0] | (b2)->fds_bits[0]); \
-		(dst)->fds_bits[1] = ((b1)->fds_bits[1] | (b2)->fds_bits[1]); \
-		(dst)->fds_bits[2] = ((b1)->fds_bits[2] | (b2)->fds_bits[2]); \
-		(dst)->fds_bits[3] = ((b1)->fds_bits[3] | (b2)->fds_bits[3]); \
-		(dst)->fds_bits[4] = ((b1)->fds_bits[4] | (b2)->fds_bits[4]); \
-		(dst)->fds_bits[5] = ((b1)->fds_bits[5] | (b2)->fds_bits[5]); \
-		(dst)->fds_bits[6] = ((b1)->fds_bits[6] | (b2)->fds_bits[6]); \
-		(dst)->fds_bits[7] = ((b1)->fds_bits[7] | (b2)->fds_bits[7]);
+        ((howmany(FD_SETSIZE, NFDBITS) > 0 && (p)->fds_bits[0]) || \
+        (howmany(FD_SETSIZE, NFDBITS) > 1 && (p)->fds_bits[1]) || \
+        (howmany(FD_SETSIZE, NFDBITS) > 2 && (p)->fds_bits[2]) || \
+        (howmany(FD_SETSIZE, NFDBITS) > 3 && (p)->fds_bits[3]) || \
+        (howmany(FD_SETSIZE, NFDBITS) > 4 && (p)->fds_bits[4]) || \
+        (howmany(FD_SETSIZE, NFDBITS) > 5 && (p)->fds_bits[5]) || \
+        (howmany(FD_SETSIZE, NFDBITS) > 6 && (p)->fds_bits[6]) || \
+        (howmany(FD_SETSIZE, NFDBITS) > 7 && (p)->fds_bits[7]))
 
-#define XFD_UNSET(dst,b1) \
-		(dst)->fds_bits[0] &= ~((b1)->fds_bits[0]); \
-		(dst)->fds_bits[1] &= ~((b1)->fds_bits[1]); \
-		(dst)->fds_bits[2] &= ~((b1)->fds_bits[2]); \
-		(dst)->fds_bits[3] &= ~((b1)->fds_bits[3]); \
-		(dst)->fds_bits[4] &= ~((b1)->fds_bits[4]); \
-		(dst)->fds_bits[5] &= ~((b1)->fds_bits[5]); \
-		(dst)->fds_bits[6] &= ~((b1)->fds_bits[6]); \
-		(dst)->fds_bits[7] &= ~((b1)->fds_bits[7]);
+#define XFD_COPYSET(src,dst) { \
+        int __i__; \
+		for (__i__ = 0; __i__ < howmany(FD_SETSIZE, NFDBITS); __i__++) \
+            (dst)->fds_bits[__i__] = (src)->fds_bits[__i__]; \
+        }
+#define XFD_ANDSET(dst,b1,b2) { \
+        int __i__; \
+        for (__i__ = 0; __i__ < howmany(FD_SETSIZE, NFDBITS); __i__++) \
+            (dst)->fds_bits[__i__] = ((b1)->fds_bits[__i__] & (b2)->fds_bits[__i__]); \
+        }
+#define XFD_ORSET(dst,b1,b2) { \
+        int __i__; \
+        for (__i__ = 0; __i__ < howmany(FD_SETSIZE, NFDBITS); __i__++) \
+		    (dst)->fds_bits[__i__] = ((b1)->fds_bits[__i__] | (b2)->fds_bits[__i__]); \
+        }        
+#define XFD_UNSET(dst,b1) { \
+        int __i__; \
+        for (__i__ = 0; __i__ < howmany(FD_SETSIZE, NFDBITS); __i__++) \
+    		(dst)->fds_bits[__i__] &= ~((b1)->fds_bits[__i__]); \
+        }
 
 #else /* USE_POLL */
 #include <sys/poll.h>





More information about the xorg-commit mailing list