s3:lib/addrchange: let addrchange_done() retry and ignore unknown message types
authorStefan Metzmacher <metze@samba.org>
Fri, 4 Feb 2011 11:32:41 +0000 (12:32 +0100)
committerVolker Lendecke <vl@samba.org>
Mon, 7 Feb 2011 09:46:52 +0000 (02:46 -0700)
Messages like RTM_NEWLINK should be just ignored.

metze

source3/lib/addrchange.c

index cf415d8c7b1265f53272f9ceb66eba3c74995a78..18269fefcc518e1e76250ad687ec47d4a806d4df 100644 (file)
@@ -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;
        }