Ver código fonte

Make non-fake tor_poll robust against -1 fds

svn:r1787
Nick Mathewson 20 anos atrás
pai
commit
d49d3dcc7b
2 arquivos alterados com 20 adições e 13 exclusões
  1. 18 6
      src/common/fakepoll.c
  2. 2 7
      src/common/fakepoll.h

+ 18 - 6
src/common/fakepoll.c

@@ -9,8 +9,9 @@
 #include "orconfig.h"
 #include "fakepoll.h"
 
-#ifdef USE_FAKE_POLL
+#ifdef HAVE_SYS_TYPES_H
 #include <sys/types.h>
+#endif
 #ifdef HAVE_UNISTD_H
 #include <unistd.h>
 #endif
@@ -27,16 +28,27 @@
 #include <winsock.h>
 #endif
 
-/* by default, windows handles only 64 fd's */
-#if defined(MS_WINDOWS) && !defined(FD_SETSIZE)
-#define FD_SETSIZE MAXCONNECTIONS
-#endif
-
 #include <assert.h>
 #include <stdlib.h>
 #include "util.h"
 #include "log.h"
 
+#ifndef USE_FAKE_POLL
+int
+tor_poll(struct pollfd *ufds, unsigned int nfds, int timeout)
+{
+        int i;
+        for (i=0;i<nfds;++i) {
+                tor_assert(ufds[i].fd >= 0);
+        }
+        return poll(ufds,nfds,timeout);
+}
+#else
+/* by default, windows handles only 64 fd's */
+#if defined(MS_WINDOWS) && !defined(FD_SETSIZE)
+#define FD_SETSIZE MAXCONNECTIONS
+#endif
+
 int
 tor_poll(struct pollfd *ufds, unsigned int nfds, int timeout)
 {

+ 2 - 7
src/common/fakepoll.h

@@ -19,15 +19,11 @@
  * select.  On Mac OS 10.3, this wrapper is kinda flaky, and we should
  * use our own.
  */
-#if (defined(HAVE_POLL_H)||defined(HAVE_SYS_POLL_H)) && !defined(_POLL_EMUL_H_)
-#define tor_poll poll
-#else
+#if !(defined(HAVE_POLL_H)||defined(HAVE_SYS_POLL_H))&&!defined(_POLL_EMUL_H_)
 #define USE_FAKE_POLL
 #endif
 
-#ifdef USE_FAKE_POLL
-
-#ifndef _POLL_EMUL_H_
+#if defined USE_FAKE_POLL && !defined(_POLL_EMUL_H_)
 struct pollfd {
   int fd;
   short events;
@@ -43,7 +39,6 @@ struct pollfd {
 #endif
 
 int tor_poll(struct pollfd *ufds, unsigned int nfds, int timeout);
-#endif
 
 #endif