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:
parent
d973a107a2
commit
3e7039349f
@ -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. */
|
||||
|
@ -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 */
|
||||
|
@ -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;
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user