diff --git a/source/nbt_server/defense.c b/source/nbt_server/defense.c index 86b3eb968b8..72ebf0c301b 100644 --- a/source/nbt_server/defense.c +++ b/source/nbt_server/defense.c @@ -41,6 +41,15 @@ void nbtd_request_defense(struct nbt_name_socket *nbtsock, struct nbtd_interface *iface = talloc_get_type(nbtsock->incoming.private, struct nbtd_interface); + /* + * if the packet comes from one of our interfaces + * it must be our winsclient trying to reach the winsserver + */ + if (nbtd_self_packet(nbtsock, packet, src)) { + nbtd_winsserver_request(nbtsock, packet, src); + return; + } + NBTD_ASSERT_PACKET(packet, src, packet->qdcount == 1); NBTD_ASSERT_PACKET(packet, src, packet->arcount == 1); NBTD_ASSERT_PACKET(packet, src, diff --git a/source/nbt_server/interfaces.c b/source/nbt_server/interfaces.c index 10bdc0bb14e..9fdad96b557 100644 --- a/source/nbt_server/interfaces.c +++ b/source/nbt_server/interfaces.c @@ -42,8 +42,8 @@ static void nbtd_request_handler(struct nbt_name_socket *nbtsock, nbtsrv->stats.total_received++; /* see if its from one of our own interfaces - if so, then ignore it */ - if (nbtd_self_packet(nbtsock, packet, src)) { - DEBUG(10,("Ignoring self packet from %s:%d\n", src->addr, src->port)); + if (nbtd_self_packet_and_bcast(nbtsock, packet, src)) { + DEBUG(10,("Ignoring bcast self packet from %s:%d\n", src->addr, src->port)); return; } diff --git a/source/nbt_server/packet.c b/source/nbt_server/packet.c index 8909d7bbc44..d73a3b027af 100644 --- a/source/nbt_server/packet.c +++ b/source/nbt_server/packet.c @@ -41,6 +41,33 @@ void nbtd_bad_packet(struct nbt_name_packet *packet, see if an incoming packet is a broadcast packet from one of our own interfaces */ +BOOL nbtd_self_packet_and_bcast(struct nbt_name_socket *nbtsock, + struct nbt_name_packet *packet, + const struct socket_address *src) +{ + struct nbtd_interface *iface = talloc_get_type(nbtsock->incoming.private, + struct nbtd_interface); + + /* if its not a broadcast then its not considered a self packet */ + if (!(packet->operation & NBT_FLAG_BROADCAST)) { + return False; + } + + /* + * this uses the fact that iface->nbtsock is the unicast listen address + * if the interface isn't the global bcast interface + * + * so if the request was directed to the unicast address it isn't a broadcast + * message + */ + if (iface->nbtsock == nbtsock && + iface != iface->nbtsrv->bcast_interface) { + return False; + } + + return nbtd_self_packet(nbtsock, packet, src); +} + BOOL nbtd_self_packet(struct nbt_name_socket *nbtsock, struct nbt_name_packet *packet, const struct socket_address *src) @@ -49,23 +76,11 @@ BOOL nbtd_self_packet(struct nbt_name_socket *nbtsock, struct nbtd_interface); struct nbtd_server *nbtsrv = iface->nbtsrv; - /* if its not a broadcast then its not considered a self packet */ - if (!(packet->operation & NBT_FLAG_BROADCAST)) { - return False; - } - /* if its not from the nbt port, then it wasn't a broadcast from us */ if (src->port != lp_nbt_port()) { return False; } - /* this uses the fact that iface->nbtsock is our non-broadcast - listen address */ - if (iface->nbtsock == nbtsock && - iface != iface->nbtsrv->bcast_interface) { - return False; - } - /* we have to loop over our interface list, seeing if its from one of our own interfaces */ for (iface=nbtsrv->interfaces;iface;iface=iface->next) {