The branch, master has been updated via 63a7d38 nsswitch: Fix two bitfield constants being the same. via d814cfa Sort winbind request flags. Ira saw we have a duplicate. via a8fe624 smbtorture: Satisfy a linker dependency via 15596a8 winbind: Handle child requests in a tevent_fd via 5e75564 winbind: Introduce "struct child_handler_state" via 3e830e4 winbind: Use standard tevent_context_init from 4f9cffb BUG 9378: Add extra attributes for AD printer publishing.
http://gitweb.samba.org/?p=samba.git;a=shortlog;h=master - Log ----------------------------------------------------------------- commit 63a7d3817fae3ec190a7919521cc0f5dbdea3b64 Author: Ira Cooper <i...@samba.org> Date: Wed Jan 16 11:33:31 2013 -0800 nsswitch: Fix two bitfield constants being the same. WBFLAG_PAM_AUTH_PAC and WBFLAG_BIG_NTLMV2_BLOB are the same causing errors in NTLMv2 authentication. Reviewed-by: Andrew Bartlett <abart...@samba.org> Reviewed-by: Jeremy Allison <j...@samba.org> Autobuild-User(master): Jeremy Allison <j...@samba.org> Autobuild-Date(master): Fri Jan 18 22:13:09 CET 2013 on sn-devel-104 commit d814cfac017039ae8fc0d1311b15cc03f4c8b2ba Author: Jeremy Allison <j...@samba.org> Date: Wed Jan 16 11:31:32 2013 -0800 Sort winbind request flags. Ira saw we have a duplicate. Signed-off-by: Jeremy Allison <j...@samba.org> Reviewed by: Ira Cooper <i...@wakeful.net> Reviewed-by: Andrew Bartlett <abart...@samba.org> commit a8fe624948f06e76aeb147ce0e47326f2d753f93 Author: Volker Lendecke <v...@samba.org> Date: Thu Jan 17 15:22:32 2013 +0100 smbtorture: Satisfy a linker dependency Reviewed by: Jeremy Allison <j...@samba.org> commit 15596a8d9c5a578fa98e110350d15265c90e8f03 Author: Volker Lendecke <v...@samba.org> Date: Thu Jan 17 14:34:35 2013 +0100 winbind: Handle child requests in a tevent_fd This enables the use of standard tevent_loop_once in the child, which now also uses epoll where available. Reviewed by: Jeremy Allison <j...@samba.org> commit 5e755643772d4615410599961859102f7c679d1c Author: Volker Lendecke <v...@samba.org> Date: Thu Jan 17 13:49:08 2013 +0100 winbind: Introduce "struct child_handler_state" This will make the next patch simpler. child_handler_state contains the information that the handler for the parent fde needs to pass to process_child_request Reviewed by: Jeremy Allison <j...@samba.org> commit 3e830e44d3eb23325fbda6f2053e58926ee2136e Author: Volker Lendecke <v...@samba.org> Date: Wed Jan 16 12:00:00 2013 +0100 winbind: Use standard tevent_context_init This makes winbind use epoll instead of poll Reviewed by: Jeremy Allison <j...@samba.org> ----------------------------------------------------------------------- Summary of changes: nsswitch/winbind_struct_protocol.h | 16 ++-- source3/torture/torture.c | 9 ++- source3/winbindd/winbindd.c | 38 +++++++- source3/winbindd/winbindd.h | 2 - source3/winbindd/winbindd_dual.c | 186 +++++++++++++++--------------------- source3/winbindd/winbindd_proto.h | 1 + 6 files changed, 126 insertions(+), 126 deletions(-) Changeset truncated at 500 lines: diff --git a/nsswitch/winbind_struct_protocol.h b/nsswitch/winbind_struct_protocol.h index c1704c8..4a41ba3 100644 --- a/nsswitch/winbind_struct_protocol.h +++ b/nsswitch/winbind_struct_protocol.h @@ -205,27 +205,25 @@ typedef struct winbindd_gr { uint32_t gr_mem_ofs; /* offset to group membership */ } WINBINDD_GR; -/* PAM specific request flags */ +/* Request flags */ #define WBFLAG_PAM_INFO3_NDR 0x00000001 #define WBFLAG_PAM_INFO3_TEXT 0x00000002 #define WBFLAG_PAM_USER_SESSION_KEY 0x00000004 #define WBFLAG_PAM_LMKEY 0x00000008 #define WBFLAG_PAM_CONTACT_TRUSTDOM 0x00000010 +#define WBFLAG_QUERY_ONLY 0x00000020 /* not used */ +#define WBFLAG_PAM_AUTH_PAC 0x00000040 #define WBFLAG_PAM_UNIX_NAME 0x00000080 #define WBFLAG_PAM_AFS_TOKEN 0x00000100 #define WBFLAG_PAM_NT_STATUS_SQUASH 0x00000200 -#define WBFLAG_PAM_KRB5 0x00001000 -#define WBFLAG_PAM_FALLBACK_AFTER_KRB5 0x00002000 -#define WBFLAG_PAM_CACHED_LOGIN 0x00004000 -#define WBFLAG_PAM_GET_PWD_POLICY 0x00008000 -#define WBFLAG_PAM_AUTH_PAC 0x00010000 - -/* generic request flags */ -#define WBFLAG_QUERY_ONLY 0x00000020 /* not used */ /* This is a flag that can only be sent from parent to child */ #define WBFLAG_IS_PRIVILEGED 0x00000400 /* not used */ /* Flag to say this is a winbindd internal send - don't recurse. */ #define WBFLAG_RECURSE 0x00000800 +#define WBFLAG_PAM_KRB5 0x00001000 +#define WBFLAG_PAM_FALLBACK_AFTER_KRB5 0x00002000 +#define WBFLAG_PAM_CACHED_LOGIN 0x00004000 +#define WBFLAG_PAM_GET_PWD_POLICY 0x00008000 /* Flag to tell winbind the NTLMv2 blob is too big for the struct and is in the * extra_data field */ #define WBFLAG_BIG_NTLMV2_BLOB 0x00010000 diff --git a/source3/torture/torture.c b/source3/torture/torture.c index d31c907..799c911 100644 --- a/source3/torture/torture.c +++ b/source3/torture/torture.c @@ -9153,7 +9153,14 @@ static struct { { "LOCAL-DBWRAP-CTDB", run_local_dbwrap_ctdb, 0 }, {NULL, NULL, 0}}; - +/* + * dummy function to satisfy linker dependency + */ +struct tevent_context *winbind_event_context(void); +struct tevent_context *winbind_event_context(void) +{ + return NULL; +} /**************************************************************************** run a specified test or "ALL" diff --git a/source3/winbindd/winbindd.c b/source3/winbindd/winbindd.c index 698c96c..ebaa080 100644 --- a/source3/winbindd/winbindd.c +++ b/source3/winbindd/winbindd.c @@ -49,14 +49,42 @@ static bool interactive = False; extern bool override_logfile; +struct tevent_context *winbind_event_context(void) +{ + static struct tevent_context *ev = NULL; + + if (ev != NULL) { + return ev; + } + + /* + * Note we MUST use the NULL context here, not the autofree context, + * to avoid side effects in forked children exiting. + */ + ev = tevent_context_init(NULL); + if (ev == NULL) { + smb_panic("Could not init winbindd's messaging context.\n"); + } + return ev; +} + struct messaging_context *winbind_messaging_context(void) { - struct messaging_context *msg_ctx = server_messaging_context(); - if (likely(msg_ctx != NULL)) { - return msg_ctx; + static struct messaging_context *msg = NULL; + + if (msg != NULL) { + return msg; + } + + /* + * Note we MUST use the NULL context here, not the autofree context, + * to avoid side effects in forked children exiting. + */ + msg = messaging_init(NULL, winbind_event_context()); + if (msg == NULL) { + smb_panic("Could not init winbindd's messaging context.\n"); } - smb_panic("Could not init winbindd's messaging context.\n"); - return NULL; + return msg; } /* Reload configuration */ diff --git a/source3/winbindd/winbindd.h b/source3/winbindd/winbindd.h index 33c7bbe..c01cac7 100644 --- a/source3/winbindd/winbindd.h +++ b/source3/winbindd/winbindd.h @@ -396,6 +396,4 @@ struct WINBINDD_CCACHE_ENTRY { #define WINBINDD_PAM_AUTH_KRB5_RENEW_TIME 2592000 /* one month */ #define DOM_SEQUENCE_NONE ((uint32)-1) -#define winbind_event_context server_event_context - #endif /* _WINBINDD_H */ diff --git a/source3/winbindd/winbindd_dual.c b/source3/winbindd/winbindd_dual.c index 60b15e3..14e60f5 100644 --- a/source3/winbindd/winbindd_dual.c +++ b/source3/winbindd/winbindd_dual.c @@ -1289,15 +1289,73 @@ struct winbindd_domain *wb_child_domain(void) return child_domain; } +struct child_handler_state { + struct winbindd_child *child; + struct winbindd_cli_state cli; +}; + +static void child_handler(struct tevent_context *ev, struct tevent_fd *fde, + uint16_t flags, void *private_data) +{ + struct child_handler_state *state = + (struct child_handler_state *)private_data; + NTSTATUS status; + struct iovec iov[2]; + int iov_count; + + /* fetch a request from the main daemon */ + status = child_read_request(&state->cli); + + if (!NT_STATUS_IS_OK(status)) { + /* we lost contact with our parent */ + _exit(0); + } + + DEBUG(4,("child daemon request %d\n", + (int)state->cli.request->cmd)); + + ZERO_STRUCTP(state->cli.response); + state->cli.request->null_term = '\0'; + state->cli.mem_ctx = talloc_tos(); + child_process_request(state->child, &state->cli); + + DEBUG(4, ("Finished processing child request %d\n", + (int)state->cli.request->cmd)); + + SAFE_FREE(state->cli.request->extra_data.data); + + iov[0].iov_base = (void *)state->cli.response; + iov[0].iov_len = sizeof(struct winbindd_response); + iov_count = 1; + + if (state->cli.response->length > + sizeof(struct winbindd_response)) { + iov[1].iov_base = + (void *)state->cli.response->extra_data.data; + iov[1].iov_len = state->cli.response->length-iov[0].iov_len; + iov_count = 2; + } + + DEBUG(10, ("Writing %d bytes to parent\n", + (int)state->cli.response->length)); + + if (write_data_iov(state->cli.sock, iov, iov_count) != + state->cli.response->length) { + DEBUG(0, ("Could not write result\n")); + exit(1); + } +} + static bool fork_domain_child(struct winbindd_child *child) { int fdpair[2]; - struct winbindd_cli_state state; + struct child_handler_state state; struct winbindd_request request; struct winbindd_response response; struct winbindd_domain *primary_domain = NULL; NTSTATUS status; ssize_t nwritten; + struct tevent_fd *fde; if (child->domain) { DEBUG(10, ("fork_domain_child called for domain '%s'\n", @@ -1313,9 +1371,10 @@ static bool fork_domain_child(struct winbindd_child *child) } ZERO_STRUCT(state); - state.pid = getpid(); - state.request = &request; - state.response = &response; + state.child = child; + state.cli.pid = getpid(); + state.cli.request = &request; + state.cli.response = &response; child->pid = fork(); @@ -1356,12 +1415,12 @@ static bool fork_domain_child(struct winbindd_child *child) DEBUG(10, ("Child process %d\n", (int)getpid())); - state.sock = fdpair[0]; + state.cli.sock = fdpair[0]; close(fdpair[1]); status = winbindd_reinit_after_fork(child, child->logfilename); - nwritten = sys_write(state.sock, &status, sizeof(status)); + nwritten = sys_write(state.cli.sock, &status, sizeof(status)); if (nwritten != sizeof(status)) { DEBUG(1, ("fork_domain_child: Could not write status: " "nwritten=%d, error=%s\n", (int)nwritten, @@ -1459,21 +1518,23 @@ static bool fork_domain_child(struct winbindd_child *child) } } + fde = tevent_add_fd(winbind_event_context(), NULL, state.cli.sock, + TEVENT_FD_READ, child_handler, &state); + if (fde == NULL) { + DEBUG(1, ("tevent_add_fd failed\n")); + _exit(1); + } + while (1) { int ret; - struct pollfd *pfds; - int num_pfds; - int timeout; - struct timeval t; - struct timeval *tp; TALLOC_CTX *frame = talloc_stackframe(); - struct iovec iov[2]; - int iov_count; - if (run_events_poll(winbind_event_context(), 0, NULL, 0)) { - TALLOC_FREE(frame); - continue; + ret = tevent_loop_once(winbind_event_context()); + if (ret != 0) { + DEBUG(1, ("tevent_loop_once failed: %s\n", + strerror(errno))); + _exit(1); } if (child->domain && child->domain->startup && @@ -1484,99 +1545,6 @@ static bool fork_domain_child(struct winbindd_child *child) child->domain->startup = False; } - pfds = talloc_zero(talloc_tos(), struct pollfd); - if (pfds == NULL) { - DEBUG(1, ("talloc failed\n")); - _exit(1); - } - - pfds->fd = state.sock; - pfds->events = POLLIN|POLLHUP; - num_pfds = 1; - - timeout = INT_MAX; - - if (!event_add_to_poll_args( - winbind_event_context(), talloc_tos(), - &pfds, &num_pfds, &timeout)) { - DEBUG(1, ("event_add_to_poll_args failed\n")); - _exit(1); - } - tp = get_timed_events_timeout(winbind_event_context(), &t); - if (tp) { - DEBUG(11,("select will use timeout of %u.%u seconds\n", - (unsigned int)tp->tv_sec, (unsigned int)tp->tv_usec )); - } - - ret = poll(pfds, num_pfds, timeout); - - if (run_events_poll(winbind_event_context(), ret, - pfds, num_pfds)) { - /* We got a signal - continue. */ - TALLOC_FREE(frame); - continue; - } - - TALLOC_FREE(pfds); - - if (ret == 0) { - DEBUG(11,("nothing is ready yet, continue\n")); - TALLOC_FREE(frame); - continue; - } - - if (ret == -1 && errno == EINTR) { - /* We got a signal - continue. */ - TALLOC_FREE(frame); - continue; - } - - if (ret == -1 && errno != EINTR) { - DEBUG(0,("poll error occured\n")); - TALLOC_FREE(frame); - perror("poll"); - _exit(1); - } - - /* fetch a request from the main daemon */ - status = child_read_request(&state); - - if (!NT_STATUS_IS_OK(status)) { - /* we lost contact with our parent */ - _exit(0); - } - - DEBUG(4,("child daemon request %d\n", (int)state.request->cmd)); - - ZERO_STRUCTP(state.response); - state.request->null_term = '\0'; - state.mem_ctx = frame; - child_process_request(child, &state); - - DEBUG(4, ("Finished processing child request %d\n", - (int)state.request->cmd)); - - SAFE_FREE(state.request->extra_data.data); - - iov[0].iov_base = (void *)state.response; - iov[0].iov_len = sizeof(struct winbindd_response); - iov_count = 1; - - if (state.response->length > sizeof(struct winbindd_response)) { - iov[1].iov_base = - (void *)state.response->extra_data.data; - iov[1].iov_len = state.response->length-iov[0].iov_len; - iov_count = 2; - } - - DEBUG(10, ("Writing %d bytes to parent\n", - (int)state.response->length)); - - if (write_data_iov(state.sock, iov, iov_count) != - state.response->length) { - DEBUG(0, ("Could not write result\n")); - exit(1); - } TALLOC_FREE(frame); } } diff --git a/source3/winbindd/winbindd_proto.h b/source3/winbindd/winbindd_proto.h index 44693d7..33b0f01 100644 --- a/source3/winbindd/winbindd_proto.h +++ b/source3/winbindd/winbindd_proto.h @@ -34,6 +34,7 @@ bool winbindd_use_idmap_cache(void); bool winbindd_use_cache(void); const char *get_winbind_pipe_dir(void); char *get_winbind_priv_pipe_dir(void); +struct tevent_context *winbind_event_context(void); int main(int argc, char **argv, char **envp); /* The following definitions come from winbindd/winbindd_ads.c */ -- Samba Shared Repository