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

Reply via email to