diff options
-rw-r--r-- | source3/include/nameserv.h | 3 | ||||
-rw-r--r-- | source3/nmbd/nmbd_packets.c | 33 | ||||
-rw-r--r-- | source3/nmbd/nmbd_responserecordsdb.c | 3 |
3 files changed, 30 insertions, 9 deletions
diff --git a/source3/include/nameserv.h b/source3/include/nameserv.h index e3a1d740a7..995a47b2fa 100644 --- a/source3/include/nameserv.h +++ b/source3/include/nameserv.h @@ -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. */ diff --git a/source3/nmbd/nmbd_packets.c b/source3/nmbd/nmbd_packets.c index ce785b40a4..7f27753352 100644 --- a/source3/nmbd/nmbd_packets.c +++ b/source3/nmbd/nmbd_packets.c @@ -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 */ diff --git a/source3/nmbd/nmbd_responserecordsdb.c b/source3/nmbd/nmbd_responserecordsdb.c index 3edca69981..0c698760bb 100644 --- a/source3/nmbd/nmbd_responserecordsdb.c +++ b/source3/nmbd/nmbd_responserecordsdb.c @@ -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; |