summaryrefslogtreecommitdiff
path: root/source4/nbt_server/interfaces.c
diff options
context:
space:
mode:
authorStefan Metzmacher <metze@sernet.de>2008-01-11 16:11:59 +0100
committerStefan Metzmacher <metze@samba.org>2009-01-19 07:05:21 +0100
commitee8f481d9422dff239a871d363da879a5776f7d9 (patch)
tree15f08fd1127e6f0f33025314204f1c42242d2d83 /source4/nbt_server/interfaces.c
parentbae593bb118459c1b0d12d02e58ba6c89400aa97 (diff)
downloadsamba-ee8f481d9422dff239a871d363da879a5776f7d9.tar.gz
samba-ee8f481d9422dff239a871d363da879a5776f7d9.tar.bz2
samba-ee8f481d9422dff239a871d363da879a5776f7d9.zip
winsserver: we need to ignore duplicated name register requests.
This fixes the following bug: While we reply with a WACK response to a client. Instead of waiting for the final reply some windows client just resends the request using the same name_trn_id in the nbt_name_packet. We handled this as a new request and send a WACK response (and the challenges) again. Then the first request gets its final success response, but the when we try to send the success for the "second" request we notice that the record was changed in between and we return an error. Windows 2003 (and I assume all other versions as well) detect the packet is just a resent of a currently pending request and ignores it. So we now keep a list of all pending WINS name register requests which result in a WACK response. On each incoming name register request we search through the list to find duplicate requests and ignore them. In theory we should do that for all requests, but name register requests are the only requests we response async and only if we have to go via the WACK code path. metze (from samba4wins tree 382e7d384b70d03e9f81c7bb353afaed288d80f0)
Diffstat (limited to 'source4/nbt_server/interfaces.c')
-rw-r--r--source4/nbt_server/interfaces.c1
1 files changed, 1 insertions, 0 deletions
diff --git a/source4/nbt_server/interfaces.c b/source4/nbt_server/interfaces.c
index 49406440cf..d466db514d 100644
--- a/source4/nbt_server/interfaces.c
+++ b/source4/nbt_server/interfaces.c
@@ -125,6 +125,7 @@ static NTSTATUS nbtd_add_socket(struct nbtd_server *nbtsrv,
iface->ip_address = talloc_steal(iface, address);
iface->netmask = talloc_steal(iface, netmask);
iface->names = NULL;
+ iface->wack_queue = NULL;
if (strcmp(netmask, "0.0.0.0") != 0) {
struct nbt_name_socket *bcast_nbtsock;