diff options
author | Stefan Metzmacher <metze@samba.org> | 2009-06-29 13:05:27 +0200 |
---|---|---|
committer | Stefan Metzmacher <metze@samba.org> | 2009-06-29 16:03:57 +0200 |
commit | b1d5e515b23acd50ae5c41c347a2cad1726d03fb (patch) | |
tree | 5d28d729d91ebd4c8beba3f4f39e07014b997346 | |
parent | bd997b257457d928108747bcca80ed7708f8dc74 (diff) | |
download | samba-b1d5e515b23acd50ae5c41c347a2cad1726d03fb.tar.gz samba-b1d5e515b23acd50ae5c41c347a2cad1726d03fb.tar.bz2 samba-b1d5e515b23acd50ae5c41c347a2cad1726d03fb.zip |
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
-rw-r--r-- | lib/tsocket/tsocket_bsd.c | 16 |
1 files changed, 12 insertions, 4 deletions
diff --git a/lib/tsocket/tsocket_bsd.c b/lib/tsocket/tsocket_bsd.c index a4cbda8b83..4f4b166e7d 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, @@ -1325,7 +1329,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,7 +1383,9 @@ 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, tstream_bsd_fde_handler, |