diff --git a/selftest/flapping.d/smbXsrv_client_ctdb_registered_ips b/selftest/flapping.d/smbXsrv_client_ctdb_registered_ips deleted file mode 100644 index 740bb87251b..00000000000 --- a/selftest/flapping.d/smbXsrv_client_ctdb_registered_ips +++ /dev/null @@ -1,4 +0,0 @@ -^samba3.blackbox.smbXsrv_client_ctdb_registered_ips.step5:.ctdb_gettickles.NUM -^samba3.blackbox.smbXsrv_client_ctdb_registered_ips.step5:.ctdb_gettickles.DST -^samba3.blackbox.smbXsrv_client_ctdb_registered_ips.step6:.ctdb_gettickles.NUM -^samba3.blackbox.smbXsrv_client_ctdb_registered_ips.step6:.ctdb_gettickles.DST diff --git a/selftest/knownfail.d/smbXsrv_client_ctdb_registered_ips b/selftest/knownfail.d/smbXsrv_client_ctdb_registered_ips deleted file mode 100644 index 8bce2bbb5db..00000000000 --- a/selftest/knownfail.d/smbXsrv_client_ctdb_registered_ips +++ /dev/null @@ -1 +0,0 @@ -^samba3.blackbox.smbXsrv_client_ctdb_registered_ips.step7:.smbstatus.0.sessions diff --git a/source3/smbd/smb2_negprot.c b/source3/smbd/smb2_negprot.c index 8f4167fc6a2..8c50fc95553 100644 --- a/source3/smbd/smb2_negprot.c +++ b/source3/smbd/smb2_negprot.c @@ -903,7 +903,14 @@ static void smbd_smb2_request_process_negprot_mc_done(struct tevent_req *subreq) if (NT_STATUS_EQUAL(status, NT_STATUS_MESSAGE_RETRIEVED)) { /* * The connection was passed to another process + * + * We mark the error as NT_STATUS_CONNECTION_IN_USE, + * in order to indicate to low level code if + * ctdbd_unregister_ips() or ctdbd_passed_ips() + * is more useful. */ + smbXsrv_connection_disconnect_transport(xconn, + NT_STATUS_CONNECTION_IN_USE); smbd_server_connection_terminate(xconn, "passed connection"); /* diff --git a/source3/smbd/smb2_process.c b/source3/smbd/smb2_process.c index d55f80646ac..fbbe4ef3992 100644 --- a/source3/smbd/smb2_process.c +++ b/source3/smbd/smb2_process.c @@ -984,9 +984,37 @@ static void smbd_server_connection_handler(struct tevent_context *ev, struct smbd_release_ip_state { struct smbXsrv_connection *xconn; struct tevent_immediate *im; + struct sockaddr_storage srv; + struct sockaddr_storage clnt; char addr[INET6_ADDRSTRLEN]; }; +static int release_ip(struct tevent_context *ev, + uint32_t src_vnn, + uint32_t dst_vnn, + uint64_t dst_srvid, + const uint8_t *msg, + size_t msglen, + void *private_data); + +static int smbd_release_ip_state_destructor(struct smbd_release_ip_state *s) +{ + struct ctdbd_connection *cconn = messaging_ctdb_connection(); + struct smbXsrv_connection *xconn = s->xconn; + + if (cconn == NULL) { + return 0; + } + + if (NT_STATUS_EQUAL(xconn->transport.status, NT_STATUS_CONNECTION_IN_USE)) { + ctdbd_passed_ips(cconn, &s->srv, &s->clnt, release_ip, s); + } else { + ctdbd_unregister_ips(cconn, &s->srv, &s->clnt, release_ip, s); + } + + return 0; +} + static void smbd_release_ip_immediate(struct tevent_context *ctx, struct tevent_immediate *im, void *private_data) @@ -1129,6 +1157,8 @@ static NTSTATUS smbd_register_ips(struct smbXsrv_connection *xconn, if (state->im == NULL) { return NT_STATUS_NO_MEMORY; } + state->srv = *srv; + state->clnt = *clnt; if (print_sockaddr(state->addr, sizeof(state->addr), srv) == NULL) { return NT_STATUS_NO_MEMORY; } @@ -1152,6 +1182,9 @@ static NTSTATUS smbd_register_ips(struct smbXsrv_connection *xconn, if (ret != 0) { return map_nt_error_from_unix(ret); } + + talloc_set_destructor(state, smbd_release_ip_state_destructor); + return NT_STATUS_OK; }