mirror of
https://github.com/samba-team/samba.git
synced 2025-02-28 01:58:17 +03:00
namepacket.c: Block SIGTERM correctly - we can only take them at defined points.
nameserv.c: Fixup name release code - used when we are going down. nameservreply.c: Relaxed check for deleting name - original code never deleted. nmbd.c: Block SIGTERM signals most of the time - see comment on namepacket above. Jeremy (jallison@whistle.com) (This used to be commit 9f4e01224751134c2f7701e2aea87d06a79d77a4)
This commit is contained in:
parent
5c4776f496
commit
d98bea900e
@ -522,7 +522,10 @@ void listen_for_packets(BOOL run_election)
|
||||
timeout.tv_sec = (run_election||num_response_packets) ? 1:NMBD_SELECT_LOOP;
|
||||
timeout.tv_usec = 0;
|
||||
|
||||
/* We can only take term signals when we are in the select. */
|
||||
BlockSignals(False, SIGTERM);
|
||||
selrtn = sys_select(&fds,&timeout);
|
||||
BlockSignals(True, SIGTERM);
|
||||
|
||||
if (FD_ISSET(ClientNMB,&fds))
|
||||
{
|
||||
|
@ -62,12 +62,18 @@ void remove_name_entry(struct subnet_record *d, char *name,int type, BOOL direct
|
||||
a de-registration packet to the local subnet before removing the
|
||||
name from its local-subnet name database. */
|
||||
|
||||
int search = FIND_SELF;
|
||||
struct name_record n;
|
||||
struct name_record *n2=NULL;
|
||||
|
||||
make_nmb_name(&n.name,name,type,scope);
|
||||
|
||||
if ((n2 = find_name_search(&d, &n.name, FIND_SELF, ipzero)))
|
||||
if(d == wins_subnet)
|
||||
search |= FIND_WINS;
|
||||
else
|
||||
search |= FIND_LOCAL;
|
||||
|
||||
if ((n2 = find_name_search(&d, &n.name, search, ipzero)))
|
||||
{
|
||||
/* check name isn't already being de-registered */
|
||||
if (NAME_DEREG(n2->ip_flgs[0].nb_flags))
|
||||
@ -79,6 +85,14 @@ void remove_name_entry(struct subnet_record *d, char *name,int type, BOOL direct
|
||||
|
||||
if (!n2) return;
|
||||
|
||||
/* Only remove names with non-zero death times. */
|
||||
if(n2->death_time == 0)
|
||||
{
|
||||
DEBUG(5,("remove_name_entry: Name %s(%d) has zero ttl - not removing.\n",
|
||||
name, type));
|
||||
return;
|
||||
}
|
||||
|
||||
/* remove the name immediately. even if the spec says we should
|
||||
first try to release them, this is too dangerous with our current
|
||||
name structures as otherwise we will end up replying to names we
|
||||
|
@ -135,10 +135,13 @@ void reply_name_release(struct packet_struct *p)
|
||||
search, ip);
|
||||
|
||||
/* XXXX under what conditions should we reject the removal?? */
|
||||
if (n && n->ip_flgs[0].nb_flags == nb_flags)
|
||||
/* For now - remove if the names match and the group bit matches. */
|
||||
if (n && (NAME_GROUP(n->ip_flgs[0].nb_flags) == NAME_GROUP(nb_flags)))
|
||||
{
|
||||
success = True;
|
||||
|
||||
DEBUG(5, ("reply_name_release: Removing name %s on subnet %s\n",
|
||||
namestr(&nmb->question.question_name), inet_ntoa(d->bcast_ip)));
|
||||
remove_name(d,n);
|
||||
n = NULL;
|
||||
}
|
||||
|
@ -571,6 +571,8 @@ static void usage(char *pname)
|
||||
|
||||
DEBUG(3,("Dumped names\n"));
|
||||
|
||||
/* We can only take sigterm signals in the select. */
|
||||
BlockSignals(True,SIGTERM);
|
||||
process();
|
||||
close_sockets();
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user