The branch, master has been updated via 857ed9ca5a99e20c0ff58e761ba87c7e6bc872bd (commit) via b1d5e515b23acd50ae5c41c347a2cad1726d03fb (commit) from bd997b257457d928108747bcca80ed7708f8dc74 (commit)
http://gitweb.samba.org/?p=samba.git;a=shortlog;h=master - Log ----------------------------------------------------------------- commit 857ed9ca5a99e20c0ff58e761ba87c7e6bc872bd Author: Stefan Metzmacher <me...@samba.org> Date: Mon Jun 29 13:13:05 2009 +0200 tsocket/bsd: also ask for TEVENT_FD_READ when we want to write into a stream socket Otherwise we would not notice a broken connection. metze commit b1d5e515b23acd50ae5c41c347a2cad1726d03fb Author: Stefan Metzmacher <me...@samba.org> Date: Mon Jun 29 13:05:27 2009 +0200 tsocket/bsd: more correctly check if the cached tevent_fd is still valid I some cases the pointer value of tevent_context is the same again, if we do something like: ev1 = tevent_context_init(); ... fde = tevent_add_fd(ev1, fd, TEVENT_FD_READ...); ... talloc_free(ev1); ... ev2 = tevent_context_init(); if (ev1 == ev2) { /* this can happen! */ } if (tevent_fd_get_flags(fde) == 0) { /* this is always true */ } But the "talloc_free(ev1)" will set fde->event_ctx to NULL and tevent_fd_get_flags() will always return 0. metze ----------------------------------------------------------------------- Summary of changes: lib/tsocket/tsocket_bsd.c | 27 +++++++++++++++++++++------ 1 files changed, 21 insertions(+), 6 deletions(-) Changeset truncated at 500 lines: diff --git a/lib/tsocket/tsocket_bsd.c b/lib/tsocket/tsocket_bsd.c index a4cbda8..78bca4b 100644 --- a/lib/tsocket/tsocket_bsd.c +++ b/lib/tsocket/tsocket_bsd.c @@ -612,7 +612,9 @@ static int tdgram_bsd_set_readable_handler(struct tdgram_bsd *bsds, TALLOC_FREE(bsds->fde); } - if (bsds->fde == NULL) { + if (tevent_fd_get_flags(bsds->fde) == 0) { + TALLOC_FREE(bsds->fde); + bsds->fde = tevent_add_fd(ev, bsds, bsds->fd, TEVENT_FD_READ, tdgram_bsd_fde_handler, @@ -664,7 +666,9 @@ static int tdgram_bsd_set_writeable_handler(struct tdgram_bsd *bsds, TALLOC_FREE(bsds->fde); } - if (bsds->fde == NULL) { + if (tevent_fd_get_flags(bsds->fde) == 0) { + TALLOC_FREE(bsds->fde); + bsds->fde = tevent_add_fd(ev, bsds, bsds->fd, TEVENT_FD_WRITE, tdgram_bsd_fde_handler, @@ -1288,6 +1292,10 @@ static void tstream_bsd_fde_handler(struct tevent_context *ev, } if (flags & TEVENT_FD_READ) { if (!bsds->readable_handler) { + if (bsds->writeable_handler) { + bsds->writeable_handler(bsds->writeable_private); + return; + } TEVENT_FD_NOT_READABLE(bsds->fde); return; } @@ -1325,7 +1333,9 @@ static int tstream_bsd_set_readable_handler(struct tstream_bsd *bsds, TALLOC_FREE(bsds->fde); } - if (bsds->fde == NULL) { + if (tevent_fd_get_flags(bsds->fde) == 0) { + TALLOC_FREE(bsds->fde); + bsds->fde = tevent_add_fd(ev, bsds, bsds->fd, TEVENT_FD_READ, tstream_bsd_fde_handler, @@ -1377,9 +1387,12 @@ static int tstream_bsd_set_writeable_handler(struct tstream_bsd *bsds, TALLOC_FREE(bsds->fde); } - if (bsds->fde == NULL) { + if (tevent_fd_get_flags(bsds->fde) == 0) { + TALLOC_FREE(bsds->fde); + bsds->fde = tevent_add_fd(ev, bsds, - bsds->fd, TEVENT_FD_WRITE, + bsds->fd, + TEVENT_FD_READ | TEVENT_FD_WRITE, tstream_bsd_fde_handler, bsds); if (!bsds->fde) { @@ -1390,7 +1403,9 @@ static int tstream_bsd_set_writeable_handler(struct tstream_bsd *bsds, /* cache the event context we're running on */ bsds->event_ptr = ev; } else if (!bsds->writeable_handler) { - TEVENT_FD_WRITEABLE(bsds->fde); + uint16_t flags = tevent_fd_get_flags(bsds->fde); + flags |= TEVENT_FD_READ | TEVENT_FD_WRITE; + tevent_fd_set_flags(bsds->fde, flags); } bsds->writeable_handler = handler; -- Samba Shared Repository