diff options
author | Stefan Metzmacher <metze@samba.org> | 2009-04-14 10:44:25 +0200 |
---|---|---|
committer | Stefan Metzmacher <metze@samba.org> | 2009-05-01 17:38:25 +0200 |
commit | b4c5387e9f10369ed18fcfbe55a6fc8f8a2e08aa (patch) | |
tree | 65b48fc2f37031f689f1c25687fe4ad44754e28a | |
parent | cc75ff1a37b1e7d9e75e718731fa30e4901850c7 (diff) | |
download | samba-b4c5387e9f10369ed18fcfbe55a6fc8f8a2e08aa.tar.gz samba-b4c5387e9f10369ed18fcfbe55a6fc8f8a2e08aa.tar.bz2 samba-b4c5387e9f10369ed18fcfbe55a6fc8f8a2e08aa.zip |
tsocket: tdgram move input checks to the common code as there're needed for all backends
We need to make sure that we free the sendto and recvfrom requests before
the tdgram_context
metze
-rw-r--r-- | lib/tsocket/tsocket.c | 70 | ||||
-rw-r--r-- | lib/tsocket/tsocket_bsd.c | 23 |
2 files changed, 69 insertions, 24 deletions
diff --git a/lib/tsocket/tsocket.c b/lib/tsocket/tsocket.c index 11ae6ce9ed..606642e983 100644 --- a/lib/tsocket/tsocket.c +++ b/lib/tsocket/tsocket.c @@ -73,8 +73,24 @@ struct tdgram_context { const char *location; const struct tdgram_context_ops *ops; void *private_data; + + struct tevent_req *recvfrom_req; + struct tevent_req *sendto_req; }; +static int tdgram_context_destructor(struct tdgram_context *dgram) +{ + if (dgram->recvfrom_req) { + tevent_req_received(dgram->recvfrom_req); + } + + if (dgram->sendto_req) { + tevent_req_received(dgram->sendto_req); + } + + return 0; +} + struct tdgram_context *_tdgram_context_create(TALLOC_CTX *mem_ctx, const struct tdgram_context_ops *ops, void *pstate, @@ -90,8 +106,10 @@ struct tdgram_context *_tdgram_context_create(TALLOC_CTX *mem_ctx, if (dgram == NULL) { return NULL; } - dgram->location = location; - dgram->ops = ops; + dgram->location = location; + dgram->ops = ops; + dgram->recvfrom_req = NULL; + dgram->sendto_req = NULL; state = talloc_size(dgram, psize); if (state == NULL) { @@ -102,6 +120,8 @@ struct tdgram_context *_tdgram_context_create(TALLOC_CTX *mem_ctx, dgram->private_data = state; + talloc_set_destructor(dgram, tdgram_context_destructor); + *ppstate = state; return dgram; } @@ -113,11 +133,21 @@ void *_tdgram_context_data(struct tdgram_context *dgram) struct tdgram_recvfrom_state { const struct tdgram_context_ops *ops; + struct tdgram_context *dgram; uint8_t *buf; size_t len; struct tsocket_address *src; }; +static int tdgram_recvfrom_destructor(struct tdgram_recvfrom_state *state) +{ + if (state->dgram) { + state->dgram->recvfrom_req = NULL; + } + + return 0; +} + static void tdgram_recvfrom_done(struct tevent_req *subreq); struct tevent_req *tdgram_recvfrom_send(TALLOC_CTX *mem_ctx, @@ -135,6 +165,18 @@ struct tevent_req *tdgram_recvfrom_send(TALLOC_CTX *mem_ctx, } state->ops = dgram->ops; + state->dgram = dgram; + state->buf = NULL; + state->len = 0; + state->src = NULL; + + if (dgram->recvfrom_req) { + tevent_req_error(req, EBUSY); + goto post; + } + dgram->recvfrom_req = req; + + talloc_set_destructor(state, tdgram_recvfrom_destructor); subreq = state->ops->recvfrom_send(state, ev, dgram); if (tevent_req_nomem(subreq, req)) { @@ -195,9 +237,19 @@ ssize_t tdgram_recvfrom_recv(struct tevent_req *req, struct tdgram_sendto_state { const struct tdgram_context_ops *ops; + struct tdgram_context *dgram; ssize_t ret; }; +static int tdgram_sendto_destructor(struct tdgram_sendto_state *state) +{ + if (state->dgram) { + state->dgram->sendto_req = NULL; + } + + return 0; +} + static void tdgram_sendto_done(struct tevent_req *subreq); struct tevent_req *tdgram_sendto_send(TALLOC_CTX *mem_ctx, @@ -217,6 +269,7 @@ struct tevent_req *tdgram_sendto_send(TALLOC_CTX *mem_ctx, } state->ops = dgram->ops; + state->dgram = dgram; state->ret = -1; if (len == 0) { @@ -224,6 +277,14 @@ struct tevent_req *tdgram_sendto_send(TALLOC_CTX *mem_ctx, goto post; } + if (dgram->sendto_req) { + tevent_req_error(req, EBUSY); + goto post; + } + dgram->sendto_req = req; + + talloc_set_destructor(state, tdgram_sendto_destructor); + subreq = state->ops->sendto_send(state, ev, dgram, buf, len, dst); if (tevent_req_nomem(subreq, req)) { @@ -296,6 +357,11 @@ struct tevent_req *tdgram_disconnect_send(TALLOC_CTX *mem_ctx, state->ops = dgram->ops; + if (dgram->recvfrom_req || dgram->sendto_req) { + tevent_req_error(req, EBUSY); + goto post; + } + subreq = state->ops->disconnect_send(state, ev, dgram); if (tevent_req_nomem(subreq, req)) { goto post; diff --git a/lib/tsocket/tsocket_bsd.c b/lib/tsocket/tsocket_bsd.c index 52cc5cc1cf..34ae60ee09 100644 --- a/lib/tsocket/tsocket_bsd.c +++ b/lib/tsocket/tsocket_bsd.c @@ -557,9 +557,6 @@ struct tdgram_bsd { void (*readable_handler)(void *private_data); void *writeable_private; void (*writeable_handler)(void *private_data); - - struct tevent_req *read_req; - struct tevent_req *write_req; }; static void tdgram_bsd_fde_handler(struct tevent_context *ev, @@ -698,7 +695,6 @@ static int tdgram_bsd_recvfrom_destructor(struct tdgram_bsd_recvfrom_state *stat struct tdgram_bsd *bsds = tdgram_context_data(state->dgram, struct tdgram_bsd); - bsds->read_req = NULL; tdgram_bsd_set_readable_handler(bsds, NULL, NULL, NULL); return 0; @@ -726,12 +722,6 @@ static struct tevent_req *tdgram_bsd_recvfrom_send(TALLOC_CTX *mem_ctx, state->len = 0; state->src = NULL; - if (bsds->read_req) { - tevent_req_error(req, EBUSY); - goto post; - } - bsds->read_req = req; - talloc_set_destructor(state, tdgram_bsd_recvfrom_destructor); if (bsds->fd == -1) { @@ -876,8 +866,8 @@ static int tdgram_bsd_sendto_destructor(struct tdgram_bsd_sendto_state *state) struct tdgram_bsd *bsds = tdgram_context_data(state->dgram, struct tdgram_bsd); - bsds->write_req = NULL; tdgram_bsd_set_writeable_handler(bsds, NULL, NULL, NULL); + return 0; } @@ -907,12 +897,6 @@ static struct tevent_req *tdgram_bsd_sendto_send(TALLOC_CTX *mem_ctx, state->dst = dst; state->ret = -1; - if (bsds->write_req) { - tevent_req_error(req, EBUSY); - goto post; - } - bsds->write_req = req; - talloc_set_destructor(state, tdgram_bsd_sendto_destructor); if (bsds->fd == -1) { @@ -1026,11 +1010,6 @@ static struct tevent_req *tdgram_bsd_disconnect_send(TALLOC_CTX *mem_ctx, return NULL; } - if (bsds->read_req || bsds->write_req) { - tevent_req_error(req, EBUSY); - goto post; - } - if (bsds->fd == -1) { tevent_req_error(req, ENOTCONN); goto post; |