diff options
author | Andrew Tridgell <tridge@samba.org> | 2005-02-14 12:46:03 +0000 |
---|---|---|
committer | Andrew Tridgell <tridge@samba.org> | 2005-02-14 12:46:03 +0000 |
commit | 21d138f1df963387b0853f87d96b52f84f9177fe (patch) | |
tree | b33389198740bcd2415331067a456d06e8485f8b | |
parent | b581007aec8c646f67f3dac8159ffd0f10677454 (diff) | |
download | samba-21d138f1df963387b0853f87d96b52f84f9177fe.tar.gz samba-21d138f1df963387b0853f87d96b52f84f9177fe.tar.xz samba-21d138f1df963387b0853f87d96b52f84f9177fe.zip |
r5397: added testing and server support for the special handling required for the 0x1d local master browser name
in WINS
-rw-r--r-- | source/nbt_server/winsserver.c | 6 | ||||
-rw-r--r-- | source/torture/nbt/wins.c | 15 |
2 files changed, 20 insertions, 1 deletions
diff --git a/source/nbt_server/winsserver.c b/source/nbt_server/winsserver.c index 38f874a196c..45b147d86d1 100644 --- a/source/nbt_server/winsserver.c +++ b/source/nbt_server/winsserver.c @@ -112,6 +112,12 @@ static void nbtd_winsserver_register(struct nbt_name_socket *nbtsock, uint16_t nb_flags = packet->additional[0].rdata.netbios.addresses[0].nb_flags; const char *address = packet->additional[0].rdata.netbios.addresses[0].ipaddr; + /* as a special case, the local master browser name is always accepted + for registration, but never stored */ + if (name->type == NBT_NAME_MASTER) { + goto done; + } + rec = winsdb_load(winssrv, name, packet); if (rec == NULL) { rcode = wins_register_new(nbtsock, packet, src_address, src_port); diff --git a/source/torture/nbt/wins.c b/source/torture/nbt/wins.c index 0fd8602a355..9258f3b5179 100644 --- a/source/torture/nbt/wins.c +++ b/source/torture/nbt/wins.c @@ -111,7 +111,7 @@ static BOOL nbt_test_wins_name(TALLOC_CTX *mem_ctx, const char *address, CHECK_STRING(io.out.wins_server, address); CHECK_VALUE(io.out.rcode, 0); - if (nb_flags & NBT_NM_GROUP) { + if (name->type != NBT_NAME_MASTER && nb_flags & NBT_NM_GROUP) { printf("Try to register as non-group\n"); io.in.nb_flags &= ~NBT_NM_GROUP; status = nbt_name_register_wins(nbtsock, mem_ctx, &io); @@ -132,6 +132,14 @@ static BOOL nbt_test_wins_name(TALLOC_CTX *mem_ctx, const char *address, query.in.retries = 0; status = nbt_name_query(nbtsock, mem_ctx, &query); + if (name->type == NBT_NAME_MASTER) { + if (!NT_STATUS_EQUAL(status, NT_STATUS_OBJECT_NAME_NOT_FOUND)) { + printf("Bad response from %s for name query - %s\n", + address, nt_errstr(status)); + return False; + } + return ret; + } if (NT_STATUS_EQUAL(status, NT_STATUS_IO_TIMEOUT)) { printf("No response from %s for name query\n", address); return False; @@ -287,6 +295,11 @@ static BOOL nbt_test_wins(TALLOC_CTX *mem_ctx, const char *address) name.scope = NULL; ret &= nbt_test_wins_name(mem_ctx, address, &name, NBT_NODE_H); + name.type = NBT_NAME_MASTER; + ret &= nbt_test_wins_name(mem_ctx, address, &name, NBT_NODE_H); + + ret &= nbt_test_wins_name(mem_ctx, address, &name, NBT_NODE_H | NBT_NM_GROUP); + name.scope = "example"; name.type = 0x72; ret &= nbt_test_wins_name(mem_ctx, address, &name, NBT_NODE_H); |