From: Ted Lemon Date: Thu, 15 Mar 2001 23:22:33 +0000 (+0000) Subject: Always reference count leases. X-Git-Tag: V3-BETA-2-PATCH-19~6 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=cb8176c4ae799eb12afb669535c14348eb18f826;p=thirdparty%2Fdhcp.git Always reference count leases. --- diff --git a/server/dhcp.c b/server/dhcp.c index 218e1268f..9dcedde7b 100644 --- a/server/dhcp.c +++ b/server/dhcp.c @@ -43,7 +43,7 @@ #ifndef lint static char copyright[] = -"$Id: dhcp.c,v 1.183 2001/03/14 15:44:39 mellon Exp $ Copyright (c) 1995-2000 The Internet Software Consortium. All rights reserved.\n"; +"$Id: dhcp.c,v 1.184 2001/03/15 23:22:08 mellon Exp $ Copyright (c) 1995-2000 The Internet Software Consortium. All rights reserved.\n"; #endif /* not lint */ #include "dhcpd.h" @@ -586,7 +586,7 @@ void dhcprelease (packet, ms_nulltp) struct packet *packet; int ms_nulltp; { - struct lease *lease = (struct lease *)0; + struct lease *lease = (struct lease *)0, *next = (struct lease *)0; struct iaddr cip; struct option_cache *oc; struct data_string data; @@ -619,11 +619,20 @@ void dhcprelease (packet, ms_nulltp) /* See if we can find a lease that matches the IP address the client is claiming. */ for (; lease; lease = lease -> n_uid) { + if (lease -> n_uid) + lease_reference (&next, lease -> n_uid, MDL); if (!memcmp (&packet -> raw -> ciaddr, lease -> ip_addr.iabuf, 4)) { break; } + lease_dereference (&lease, MDL); + if (next) { + lease_reference (&lease, next, MDL); + lease_dereference (&next, MDL); + } } + if (next) + lease_dereference (&next, MDL); } /* The client is supposed to pass a valid client-identifier, @@ -1338,6 +1347,7 @@ void ack_lease (packet, lease, offer, when, msg, ms_nulltp) { struct lease *lt; struct lease_state *state; + struct lease *next; TIME lease_time; TIME offered_lease_time; struct data_string d1; @@ -1474,27 +1484,35 @@ void ack_lease (packet, lease, offer, when, msg, ms_nulltp) oc, MDL)) { struct lease *seek; if (lease -> uid_len) { - struct lease *s; do { seek = (struct lease *)0; find_lease_by_uid (&seek, lease -> uid, lease -> uid_len, MDL); + if (!seek) + break; /* Don't release expired leases, and don't release the lease we're going to assign. */ - s = seek; - while (s) { - if (s != lease && - s -> ends > cur_time) + next = (struct lease *)0; + while (seek) { + if (seek -> n_uid) + lease_reference (&next, + seek -> n_uid, + MDL); + if (seek != lease && + seek -> ends > cur_time) break; - s = s -> n_uid; - } - if (s) { - release_lease (s, packet); + lease_dereference (&seek, MDL); + if (next) + lease_reference (&seek, next, MDL); } - if (seek) + if (seek) { + release_lease (seek, packet); lease_dereference (&seek, MDL); - } while (s); + } + if (next) + lease_dereference (&next, MDL); + } while (1); } if (!lease -> uid_len || (lease -> host && @@ -1507,25 +1525,30 @@ void ack_lease (packet, lease, offer, when, msg, ms_nulltp) state -> options, &lease -> scope, oc, MDL))) { - struct lease *s; do { seek = (struct lease *)0; find_lease_by_hw_addr (&seek, lease -> hardware_addr.hbuf, lease -> hardware_addr.hlen, MDL); - s = seek; - while (s) { - if (s != lease && - s -> ends > cur_time) + if (!seek) + break; + next = (struct lease *)0; + while (seek) { + if (seek -> n_hw) + lease_reference (&next, + seek -> n_hw, MDL); + if (seek != lease && + seek -> ends > cur_time) break; - s = s -> n_hw; - } - if (s) { - release_lease (s, packet); + lease_dereference (&seek, MDL); + if (next) + lease_reference (&seek, next, MDL); } - if (seek) + if (seek) { + release_lease (seek, packet); lease_dereference (&seek, MDL); - } while (s); + } + } while (1); } } diff --git a/server/mdb.c b/server/mdb.c index e1ad705e9..a009c03d2 100644 --- a/server/mdb.c +++ b/server/mdb.c @@ -43,7 +43,7 @@ #ifndef lint static char copyright[] = -"$Id: mdb.c,v 1.54 2001/03/14 15:45:41 mellon Exp $ Copyright (c) 1996-2000 The Internet Software Consortium. All rights reserved.\n"; +"$Id: mdb.c,v 1.55 2001/03/15 23:22:33 mellon Exp $ Copyright (c) 1996-2000 The Internet Software Consortium. All rights reserved.\n"; #endif /* not lint */ #include "dhcpd.h" @@ -1488,7 +1488,7 @@ void uid_hash_add (lease) struct lease *lease; { struct lease *head = (struct lease *)0; - struct lease *scan; + struct lease *scan = (struct lease *)0, *next; /* If it's not in the hash, just add it. */ @@ -1497,9 +1497,13 @@ void uid_hash_add (lease) lease -> uid_len, lease, MDL); else { /* Otherwise, attach it to the end of the list. */ - for (scan = head; scan -> n_uid; scan = scan -> n_uid) - ; - lease_reference (&scan -> n_uid, lease, MDL); + while (head -> n_uid) { + lease_reference (&next, head -> n_uid, MDL); + lease_dereference (&head, MDL); + lease_reference (&head, next, MDL); + lease_dereference (&next, MDL); + } + lease_reference (&head -> n_uid, lease, MDL); lease_dereference (&head, MDL); } } @@ -1558,7 +1562,7 @@ void hw_hash_add (lease) struct lease *lease; { struct lease *head = (struct lease *)0; - struct lease *scan; + struct lease *next = (struct lease *)0; /* If it's not in the hash, just add it. */ if (!find_lease_by_hw_addr (&head, lease -> hardware_addr.hbuf, @@ -1569,9 +1573,14 @@ void hw_hash_add (lease) lease, MDL); else { /* Otherwise, attach it to the end of the list. */ - for (scan = head; scan -> n_hw; scan = scan -> n_hw) - ; - lease_reference (&scan -> n_hw, lease, MDL); + while (head -> n_hw) { + lease_reference (&next, head -> n_hw, MDL); + lease_dereference (&head, MDL); + lease_reference (&head, next, MDL); + lease_dereference (&next, MDL); + } + + lease_reference (&head -> n_hw, lease, MDL); lease_dereference (&head, MDL); } } @@ -1582,7 +1591,7 @@ void hw_hash_delete (lease) struct lease *lease; { struct lease *head = (struct lease *)0; - struct lease *scan; + struct lease *next; /* If it's not in the hash, we have no work to do. */ if (!find_lease_by_hw_addr (&head, lease -> hardware_addr.hbuf, @@ -1610,20 +1619,25 @@ void hw_hash_delete (lease) /* Otherwise, look for the lease in the list of leases attached to the hash table entry, and remove it if we find it. */ - for (scan = head; scan -> n_hw; scan = scan -> n_hw) { - if (scan -> n_hw == lease) { - lease_dereference (&scan -> n_hw, MDL); + while (head -> n_hw) { + if (head -> n_hw == lease) { + lease_dereference (&head -> n_hw, MDL); if (lease -> n_hw) { - lease_reference (&scan -> n_hw, + lease_reference (&head -> n_hw, lease -> n_hw, MDL); lease_dereference (&lease -> n_hw, MDL); } break; } + lease_reference (&next, head -> n_hw, MDL); + lease_dereference (&head, MDL); + lease_reference (&head, next, MDL); + lease_dereference (&next, MDL); } } - lease_dereference (&head, MDL); + if (head) + lease_dereference (&head, MDL); } /* Write all interesting leases to permanent storage. */