#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"
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;
/* 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,
{
struct lease *lt;
struct lease_state *state;
+ struct lease *next;
TIME lease_time;
TIME offered_lease_time;
struct data_string d1;
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 &&
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);
}
}
#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"
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. */
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);
}
}
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,
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);
}
}
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,
/* 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. */