]> git.ipfire.org Git - thirdparty/dhcp.git/commitdiff
Always reference count leases.
authorTed Lemon <source@isc.org>
Thu, 15 Mar 2001 23:22:33 +0000 (23:22 +0000)
committerTed Lemon <source@isc.org>
Thu, 15 Mar 2001 23:22:33 +0000 (23:22 +0000)
server/dhcp.c
server/mdb.c

index 218e1268f368068803935272a5f63cd10e1b056f..9dcedde7b9934abbb5eb76f938723be484b1ac7f 100644 (file)
@@ -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);
                }
        }
        
index e1ad705e9faec84bdb39fd8494bdd8875857bcbb..a009c03d2d6d9b99113534374119bf91663e3946 100644 (file)
@@ -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. */