From: Stefan Metzmacher Date: Fri, 4 Feb 2011 11:32:41 +0000 (+0100) Subject: s3:lib/addrchange: let addrchange_done() retry and ignore unknown message types X-Git-Url: http://git.samba.org/?p=obnox%2Fsamba-ctdb.git;a=commitdiff_plain;h=50b786834863c2b3e48b4edcf40ebf1a6909715d s3:lib/addrchange: let addrchange_done() retry and ignore unknown message types Messages like RTM_NEWLINK should be just ignored. metze --- diff --git a/source3/lib/addrchange.c b/source3/lib/addrchange.c index cf415d8c7b..18269fefcc 100644 --- a/source3/lib/addrchange.c +++ b/source3/lib/addrchange.c @@ -82,6 +82,8 @@ static int addrchange_context_destructor(struct addrchange_context *c) } struct addrchange_state { + struct tevent_context *ev; + struct addrchange_context *ctx; uint8_t buf[8192]; struct sockaddr_storage fromaddr; socklen_t fromaddr_len; @@ -103,14 +105,15 @@ struct tevent_req *addrchange_send(TALLOC_CTX *mem_ctx, if (req == NULL) { return NULL; } + state->ev = ev; + state->ctx = ctx; state->fromaddr_len = sizeof(state->fromaddr); - - subreq = recvfrom_send(state, ev, ctx->sock, + subreq = recvfrom_send(state, state->ev, state->ctx->sock, state->buf, sizeof(state->buf), 0, &state->fromaddr, &state->fromaddr_len); if (tevent_req_nomem(subreq, req)) { - return tevent_req_post(req, ev); + return tevent_req_post(req, state->ev); } tevent_req_set_callback(subreq, addrchange_done, req); return req; @@ -165,8 +168,16 @@ static void addrchange_done(struct tevent_req *subreq) state->type = ADDRCHANGE_DEL; break; default: - DEBUG(10, ("Got unexpected type %d\n", h->nlmsg_type)); - tevent_req_nterror(req, NT_STATUS_INVALID_ADDRESS); + DEBUG(10, ("Got unexpected type %d - ignoring\n", h->nlmsg_type)); + + state->fromaddr_len = sizeof(state->fromaddr); + subreq = recvfrom_send(state, state->ev, state->ctx->sock, + state->buf, sizeof(state->buf), 0, + &state->fromaddr, &state->fromaddr_len); + if (tevent_req_nomem(subreq, req)) { + return; + } + tevent_req_set_callback(subreq, addrchange_done, req); return; }