[Xorg-commit] xc/include Xpoll.h,1.1.4.1,1.1.4.1.2.1

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-serv6644

Modified Files:
      Tag: CYGWIN
	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.4.1
retrieving revision 1.1.4.1.2.1
diff -u -d -r1.1.4.1 -r1.1.4.1.2.1
--- Xpoll.h	17 Nov 2003 19:03:40 -0000	1.1.4.1
+++ Xpoll.h	3 Feb 2004 17:29:50 -0000	1.1.4.1.2.1
@@ -117,63 +117,36 @@
 #define FD_ZERO(p)      bzero((char *)(p), sizeof(*(p)))
 #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.
- */
 #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]);
+        ((FD_SETSIZE > 0 && (p)->fds_bits[0]) || \
+        (FD_SETSIZE > 32 && (p)->fds_bits[1]) || \
+        (FD_SETSIZE > 64 && (p)->fds_bits[2]) || \
+        (FD_SETSIZE > 96 && (p)->fds_bits[3]) || \
+        (FD_SETSIZE > 128 && (p)->fds_bits[4]) || \
+        (FD_SETSIZE > 160 && (p)->fds_bits[5]) || \
+        (FD_SETSIZE > 192 && (p)->fds_bits[6]) || \
+        (FD_SETSIZE > 224 && (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