diff options
-rw-r--r-- | lib/util/select.c | 90 | ||||
-rw-r--r-- | lib/util/select.h | 1 | ||||
-rw-r--r-- | source3/lib/events.c | 11 | ||||
-rw-r--r-- | source3/lib/g_lock.c | 12 | ||||
-rw-r--r-- | source3/lib/util_sock.c | 4 | ||||
-rw-r--r-- | source3/nmbd/nmbd_packets.c | 2 | ||||
-rw-r--r-- | source3/smbd/process.c | 2 | ||||
-rw-r--r-- | source3/winbindd/winbindd_dual.c | 2 |
8 files changed, 14 insertions, 110 deletions
diff --git a/lib/util/select.c b/lib/util/select.c index 63be55cf0c..5e66344c9d 100644 --- a/lib/util/select.c +++ b/lib/util/select.c @@ -23,96 +23,6 @@ #include "system/select.h" #include "lib/util/select.h" -/* This is here because it allows us to avoid a nasty race in signal handling. - We need to guarantee that when we get a signal we get out of a select immediately - but doing that involves a race condition. We can avoid the race by getting the - signal handler to write to a pipe that is in the select/poll list - - This means all Samba signal handlers should call sys_select_signal(). -*/ - -static pid_t initialised; -static int select_pipe[2]; -static volatile unsigned pipe_written, pipe_read; - -/* - * sys_poll expects pollfd's to be a talloc'ed array. - * - * It expects the talloc_array_length(fds) >= num_fds+1 to give space - * to the signal pipe. - */ - -int sys_poll(struct pollfd *fds, int num_fds, int timeout) -{ - int ret; - - if (talloc_array_length(fds) < num_fds+1) { - errno = ENOSPC; - return -1; - } - - if (initialised != sys_getpid()) { - if (pipe(select_pipe) == -1) - { - int saved_errno = errno; - DEBUG(0, ("sys_poll: pipe failed (%s)\n", - strerror(errno))); - errno = saved_errno; - return -1; - } - - /* - * These next two lines seem to fix a bug with the Linux - * 2.0.x kernel (and probably other UNIXes as well) where - * the one byte read below can block even though the - * select returned that there is data in the pipe and - * the pipe_written variable was incremented. Thanks to - * HP for finding this one. JRA. - */ - - if(set_blocking(select_pipe[0],0)==-1) - smb_panic("select_pipe[0]: O_NONBLOCK failed"); - if(set_blocking(select_pipe[1],0)==-1) - smb_panic("select_pipe[1]: O_NONBLOCK failed"); - - initialised = sys_getpid(); - } - - ZERO_STRUCT(fds[num_fds]); - fds[num_fds].fd = select_pipe[0]; - fds[num_fds].events = POLLIN|POLLHUP; - - errno = 0; - ret = poll(fds, num_fds+1, timeout); - - if ((ret >= 0) && (fds[num_fds].revents & (POLLIN|POLLHUP|POLLERR))) { - char c; - int saved_errno = errno; - - if (read(select_pipe[0], &c, 1) == 1) { - pipe_read += 1; - - /* Mark Weaver <mark-clist@npsl.co.uk> pointed out a critical - fix to ensure we don't lose signals. We must always - return -1 when the select pipe is set, otherwise if another - fd is also ready (so ret == 2) then we used to eat the - byte in the pipe and lose the signal. JRA. - */ - ret = -1; -#if 0 - /* JRA - we can use this to debug the signal messaging... */ - DEBUG(0,("select got %u signal\n", (unsigned int)c)); -#endif - errno = EINTR; - } else { - ret -= 1; - errno = saved_errno; - } - } - - return ret; -} - int sys_poll_intr(struct pollfd *fds, int num_fds, int timeout) { int orig_timeout = timeout; diff --git a/lib/util/select.h b/lib/util/select.h index bfc78a99d2..fa1970ec01 100644 --- a/lib/util/select.h +++ b/lib/util/select.h @@ -24,7 +24,6 @@ /* The following definitions come from lib/util/select.c */ -int sys_poll(struct pollfd *fds, int num_fds, int timeout); int sys_poll_intr(struct pollfd *fds, int num_fds, int timeout); #endif diff --git a/source3/lib/events.c b/source3/lib/events.c index 77589f8e7e..c71876ce39 100644 --- a/source3/lib/events.c +++ b/source3/lib/events.c @@ -101,14 +101,9 @@ bool event_add_to_poll_args(struct tevent_context *ev, TALLOC_CTX *mem_ctx, fds = *pfds; num_pollfds = *pnum_pfds; - /* - * The +1 is for the sys_poll calling convention. It expects - * an array 1 longer for the signal pipe - */ - - if (talloc_array_length(fds) < num_pollfds + num_fds + 1) { + if (talloc_array_length(fds) < num_pollfds + num_fds) { fds = talloc_realloc(mem_ctx, fds, struct pollfd, - num_pollfds + num_fds + 1); + num_pollfds + num_fds); if (fds == NULL) { DEBUG(10, ("talloc_realloc failed\n")); return false; @@ -338,7 +333,7 @@ static int s3_event_loop_once(struct tevent_context *ev, const char *location) return -1; } - ret = sys_poll(state->pfds, num_pfds, timeout); + ret = poll(state->pfds, num_pfds, timeout); if (ret == -1 && errno != EINTR) { tevent_debug(ev, TEVENT_DEBUG_FATAL, "poll() failed: %d:%s\n", diff --git a/source3/lib/g_lock.c b/source3/lib/g_lock.c index 1fd8ae9f38..1011584a25 100644 --- a/source3/lib/g_lock.c +++ b/source3/lib/g_lock.c @@ -395,11 +395,11 @@ NTSTATUS g_lock_lock(struct g_lock_ctx *ctx, const char *name, */ /* - * We allocate 2 entries here. One is needed anyway for - * sys_poll and in the clustering case we might have to add - * the ctdb fd. This avoids the realloc then. + * We allocate 1 entries here. In the clustering case + * we might have to add the ctdb fd. This avoids the + * realloc then. */ - pollfds = talloc_array(talloc_tos(), struct pollfd, 2); + pollfds = talloc_array(talloc_tos(), struct pollfd, 1); if (pollfds == NULL) { status = NT_STATUS_NO_MEMORY; break; @@ -425,8 +425,8 @@ NTSTATUS g_lock_lock(struct g_lock_ctx *ctx, const char *name, select_timeout = timeval_min(&select_timeout, &timeout_remaining); - ret = sys_poll(pollfds, num_pollfds, - timeval_to_msec(select_timeout)); + ret = poll(pollfds, num_pollfds, + timeval_to_msec(select_timeout)); /* * We're not *really interested in the actual flags. We just diff --git a/source3/lib/util_sock.c b/source3/lib/util_sock.c index dcc41bb699..69e33f7725 100644 --- a/source3/lib/util_sock.c +++ b/source3/lib/util_sock.c @@ -1604,7 +1604,7 @@ int poll_one_fd(int fd, int events, int timeout, int *revents) int ret; int saved_errno; - fds = talloc_zero_array(talloc_tos(), struct pollfd, 2); + fds = talloc_zero_array(talloc_tos(), struct pollfd, 1); if (fds == NULL) { errno = ENOMEM; return -1; @@ -1612,7 +1612,7 @@ int poll_one_fd(int fd, int events, int timeout, int *revents) fds[0].fd = fd; fds[0].events = events; - ret = sys_poll(fds, 1, timeout); + ret = poll(fds, 1, timeout); /* * Assign whatever poll did, even in the ret<=0 case. diff --git a/source3/nmbd/nmbd_packets.c b/source3/nmbd/nmbd_packets.c index edac6f6b9f..81e2f7f673 100644 --- a/source3/nmbd/nmbd_packets.c +++ b/source3/nmbd/nmbd_packets.c @@ -1935,7 +1935,7 @@ bool listen_for_packets(struct messaging_context *msg, bool run_election) event_add_to_poll_args(nmbd_event_context(), NULL, &fds, &num_sockets, &timeout); - pollrtn = sys_poll(fds, num_sockets, timeout); + pollrtn = poll(fds, num_sockets, timeout); if (run_events_poll(nmbd_event_context(), pollrtn, fds, num_sockets)) { return False; diff --git a/source3/smbd/process.c b/source3/smbd/process.c index 2f8f88fa2a..f295a59f86 100644 --- a/source3/smbd/process.c +++ b/source3/smbd/process.c @@ -967,7 +967,7 @@ static NTSTATUS smbd_server_connection_loop_once(struct tevent_context *ev_ctx, int sav; START_PROFILE(smbd_idle); - ret = sys_poll(conn->pfds, num_pfds, timeout); + ret = poll(conn->pfds, num_pfds, timeout); sav = errno; END_PROFILE(smbd_idle); diff --git a/source3/winbindd/winbindd_dual.c b/source3/winbindd/winbindd_dual.c index d0bcd3bd40..f11dae7e08 100644 --- a/source3/winbindd/winbindd_dual.c +++ b/source3/winbindd/winbindd_dual.c @@ -1507,7 +1507,7 @@ static bool fork_domain_child(struct winbindd_child *child) (unsigned int)tp->tv_sec, (unsigned int)tp->tv_usec )); } - ret = sys_poll(pfds, num_pfds, timeout); + ret = poll(pfds, num_pfds, timeout); if (run_events_poll(winbind_event_context(), ret, pfds, num_pfds)) { |