summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndrew Tridgell <tridge@samba.org>2005-06-30 01:26:52 +0000
committerGerald (Jerry) Carter <jerry@samba.org>2007-10-10 13:18:57 -0500
commitc58c7c416412fd2ae90427f500b2d94996c36c48 (patch)
tree504136e98bf0749c562b8ac0104f663a9d9d0def
parentddffc922dfdc2572dc622d5fdb89095d356a83e9 (diff)
downloadsamba-c58c7c416412fd2ae90427f500b2d94996c36c48.tar.gz
samba-c58c7c416412fd2ae90427f500b2d94996c36c48.tar.bz2
samba-c58c7c416412fd2ae90427f500b2d94996c36c48.zip
r8002: favor addresses on our local interfaces in NBT name resolution if
possible. This is needed because w2k3 will return bogus IPs in its name resolution replies when it has an unplugged network interface. (This used to be commit 2fafc230520fb5bbe9f763de94aaba87b56f5411)
-rw-r--r--source4/lib/netif/interface.c13
-rw-r--r--source4/libcli/resolve/nbtlist.c15
2 files changed, 27 insertions, 1 deletions
diff --git a/source4/lib/netif/interface.c b/source4/lib/netif/interface.c
index 80041d5350..670913ab6f 100644
--- a/source4/lib/netif/interface.c
+++ b/source4/lib/netif/interface.c
@@ -353,3 +353,16 @@ const char *iface_best_ip(const char *dest)
}
return iface_n_ip(0);
}
+
+/*
+ return True if an IP is one one of our local networks
+*/
+BOOL iface_is_local(const char *dest)
+{
+ struct in_addr ip;
+ ip.s_addr = interpret_addr(dest);
+ if (iface_find(ip, True)) {
+ return True;
+ }
+ return False;
+}
diff --git a/source4/libcli/resolve/nbtlist.c b/source4/libcli/resolve/nbtlist.c
index d5b01e06d9..0026c6fceb 100644
--- a/source4/libcli/resolve/nbtlist.c
+++ b/source4/libcli/resolve/nbtlist.c
@@ -66,8 +66,21 @@ static void nbtlist_handler(struct nbt_name_request *req)
c->state = SMBCLI_REQUEST_ERROR;
c->status = NT_STATUS_UNEXPECTED_NETWORK_ERROR;
} else {
+ struct nbt_name_query *q = &state->io_queries[i];
c->state = SMBCLI_REQUEST_DONE;
- state->reply_addr = talloc_steal(state, state->io_queries[i].out.reply_addrs[0]);
+ /* favor a local address if possible */
+ state->reply_addr = NULL;
+ for (i=0;i<q->out.num_addrs;i++) {
+ if (iface_is_local(q->out.reply_addrs[i])) {
+ state->reply_addr = talloc_steal(state,
+ q->out.reply_addrs[i]);
+ break;
+ }
+ }
+ if (state->reply_addr == NULL) {
+ state->reply_addr = talloc_steal(state,
+ q->out.reply_addrs[0]);
+ }
}
}