summaryrefslogtreecommitdiff
path: root/source3/nmbd
diff options
context:
space:
mode:
Diffstat (limited to 'source3/nmbd')
-rw-r--r--source3/nmbd/asyncdns.c12
-rw-r--r--source3/nmbd/nmbd_mynames.c3
-rw-r--r--source3/nmbd/nmbd_responserecordsdb.c25
-rw-r--r--source3/nmbd/nmbd_winsserver.c14
4 files changed, 52 insertions, 2 deletions
diff --git a/source3/nmbd/asyncdns.c b/source3/nmbd/asyncdns.c
index ee3fdfcd17..3b71369d67 100644
--- a/source3/nmbd/asyncdns.c
+++ b/source3/nmbd/asyncdns.c
@@ -187,6 +187,9 @@ void run_dns_queue(void)
if (fd_in == -1)
return;
+ /* Allow SIGTERM to kill us. */
+ BlockSignals(False, SIGTERM);
+
if (!process_exists(child_pid)) {
close(fd_in);
start_async_dns();
@@ -197,9 +200,12 @@ void run_dns_queue(void)
DEBUG(0,("Incomplete DNS answer from child!\n"));
fd_in = -1;
}
+ BlockSignals(True, SIGTERM);
return;
}
+ BlockSignals(True, SIGTERM);
+
namerec = add_dns_result(&r.name, r.result);
if (dns_current) {
@@ -305,8 +311,14 @@ BOOL queue_dns_query(struct packet_struct *p,struct nmb_name *question,
DEBUG(3,("DNS search for %s - ", namestr(question)));
+ /* Unblock TERM signal so we can be killed in DNS lookup. */
+ BlockSignals(False, SIGTERM);
+
dns_ip.s_addr = interpret_addr(qname);
+ /* Re-block TERM signal. */
+ BlockSignals(True, SIGTERM);
+
*n = add_dns_result(question, dns_ip);
if(*n == NULL)
send_wins_name_query_response(NAM_ERR, p, NULL);
diff --git a/source3/nmbd/nmbd_mynames.c b/source3/nmbd/nmbd_mynames.c
index 035d1e6d3f..9441449bed 100644
--- a/source3/nmbd/nmbd_mynames.c
+++ b/source3/nmbd/nmbd_mynames.c
@@ -156,7 +156,8 @@ void refresh_my_names(time_t t)
multiple refresh calls being done. We actually
deal with refresh failure in the fail_fn.
*/
- refresh_name(subrec, namerec, NULL, NULL, NULL);
+ if(!is_refresh_already_queued( subrec, namerec))
+ refresh_name(subrec, namerec, NULL, NULL, NULL);
namerec->death_time += lp_max_ttl();
namerec->refresh_time += lp_max_ttl();
}
diff --git a/source3/nmbd/nmbd_responserecordsdb.c b/source3/nmbd/nmbd_responserecordsdb.c
index a075284a4a..ceace36a61 100644
--- a/source3/nmbd/nmbd_responserecordsdb.c
+++ b/source3/nmbd/nmbd_responserecordsdb.c
@@ -236,3 +236,28 @@ matching record.\n", id));
return NULL;
}
+
+/****************************************************************************
+ Check if a refresh is queued for a particular name on a particular subnet.
+ **************************************************************************/
+
+BOOL is_refresh_already_queued(struct subnet_record *subrec, struct name_record *namerec)
+{
+ struct response_record *rrec = NULL;
+
+ for (rrec = subrec->responselist; rrec; rrec = rrec->next)
+ {
+ struct packet_struct *p = rrec->packet;
+ struct nmb_packet *nmb = &p->packet.nmb;
+
+ if((nmb->header.opcode == NMB_NAME_REFRESH_OPCODE_8) ||
+ (nmb->header.opcode == NMB_NAME_REFRESH_OPCODE_9))
+ {
+ /* Yes it's a queued refresh - check if the name is correct. */
+ if(nmb_name_equal(&nmb->question.question_name, &namerec->name))
+ return True;
+ }
+ }
+
+ return False;
+}
diff --git a/source3/nmbd/nmbd_winsserver.c b/source3/nmbd/nmbd_winsserver.c
index eb120e0918..134b758c29 100644
--- a/source3/nmbd/nmbd_winsserver.c
+++ b/source3/nmbd/nmbd_winsserver.c
@@ -1052,6 +1052,18 @@ is one of our (WINS server) names. Denying registration.\n", namestr(question) )
}
/*
+ * If the name exists check if the IP address is already registered
+ * to that name. If so then update the ttl and reply success.
+ */
+
+ if((namerec != NULL) && find_ip_in_name_record(namerec, from_ip))
+ {
+ update_name_ttl(namerec, ttl);
+ send_wins_name_registration_response(0, ttl, p);
+ return;
+ }
+
+ /*
* If the name exists do a query to the owner
* to see if they still want the name.
*/
@@ -1548,7 +1560,7 @@ void wins_write_database(void)
if (namerec->source == REGISTER_NAME)
{
- fprintf(fp, "%s#%02x %d ",
+ fprintf(fp, "\"%s#%02x\" %d ",
namerec->name.name,namerec->name.name_type, /* Ignore scope. */
(int)namerec->death_time);