1
0
mirror of https://github.com/samba-team/samba.git synced 2025-02-02 09:47:23 +03:00

Fix bug with nmbd running wild due to recursion in retransmit_or_expire_response_records().

Jeremy.
(This used to be commit d5f05b4faef50e7cfc0ed05a87d92e14102106c6)
This commit is contained in:
Jeremy Allison 1998-12-17 21:41:28 +00:00
parent d973a107a2
commit 3e7039349f
3 changed files with 30 additions and 9 deletions

View File

@ -369,6 +369,9 @@ struct response_record
time_t repeat_time;
time_t repeat_interval;
int repeat_count;
/* Recursion protection. */
BOOL in_expiration_processing;
};
/* A subnet structure. It contains a list of workgroups and netbios names. */

View File

@ -1633,16 +1633,31 @@ to IP %s on subnet %s\n", rrec->response_id, inet_ntoa(rrec->packet->ip),
on subnet %s\n", rrec->response_id, inet_ntoa(rrec->packet->ip),
subrec->subnet_name));
/* Call the timeout function. This will deal with removing the
timed out packet. */
if(rrec->timeout_fn)
(*rrec->timeout_fn)(subrec, rrec);
else
/*
* Check the flag in this record to prevent recursion if we end
* up in this function again via the timeout function call.
*/
if(!rrec->in_expiration_processing)
{
/* We must remove the record ourself if there is
no timeout function. */
remove_response_record(subrec, rrec);
}
/*
* Set the recursion protection flag in this record.
*/
rrec->in_expiration_processing = True;
/* Call the timeout function. This will deal with removing the
timed out packet. */
if(rrec->timeout_fn)
(*rrec->timeout_fn)(subrec, rrec);
else
{
/* We must remove the record ourself if there is
no timeout function. */
remove_response_record(subrec, rrec);
}
} /* !rrec->in_expitation_processing */
} /* rrec->repeat_count > 0 */
} /* rrec->repeat_time <= t */
} /* end for rrec */

View File

@ -172,6 +172,9 @@ struct response_record *make_response_record( struct subnet_record *subrec,
rrec->repeat_count = 3; /* 3 retries */
rrec->repeat_time = time(NULL) + rrec->repeat_interval; /* initial retry time */
/* This packet is not being processed. */
rrec->in_expiration_processing = False;
/* Lock the packet so we won't lose it while it's on the list. */
p->locked = True;