Received: from pch.mit.edu (PCH.MIT.EDU [18.7.21.90]) by krbdev.mit.edu (8.9.3p2) with ESMTP id RAA06130; Fri, 27 Aug 2004 17:14:46 -0400 (EDT) Received: from pch.mit.edu (localhost [127.0.0.1]) by pch.mit.edu (8.12.8p2/8.12.8) with ESMTP id i7RLEjWM016359 for ; Fri, 27 Aug 2004 17:14:45 -0400 (EDT) Received: from biscayne-one-station.mit.edu (BISCAYNE-ONE-STATION.MIT.EDU [18.7.7.80]) by pch.mit.edu (8.12.8p2/8.12.8) with ESMTP id i7RLEhWM016352 for ; Fri, 27 Aug 2004 17:14:43 -0400 (EDT) Received: from manawatu-mail-centre.mit.edu (MANAWATU-MAIL-CENTRE.MIT.EDU [18.7.7.71])i7RLEZah016263; Fri, 27 Aug 2004 17:14:35 -0400 (EDT) Received: from all-in-one.mit.edu (ALL-IN-ONE.MIT.EDU [18.18.1.71]) (authenticated bits=56) (User authenticated as raeburn@ATHENA.MIT.EDU)i7RLCBJV023573 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NOT); Fri, 27 Aug 2004 17:12:11 -0400 (EDT) Received: (from raeburn@localhost) by all-in-one.mit.edu (8.12.9) id i7RLCBGX008603; Fri, 27 Aug 2004 17:12:11 -0400 To: krb5-bugs@mit.edu From: Ken Raeburn Date: Fri, 27 Aug 2004 17:12:11 -0400 Message-Id: MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Subject: profile iterator breaks when modifications made X-Beenthere: krb5-bugs-incoming@mit.edu X-Mailman-Version: 2.1 Precedence: list Sender: krb5-bugs-incoming-bounces@mit.edu Errors-To: krb5-bugs-incoming-bounces@mit.edu X-RT-Original-Encoding: us-ascii Content-Length: 3070 (This is a problem Miro ran into long ago, but we haven't bothered to track down.) If a program uses an iterator to walk over a set of entries in the profile with a particular set of names, it's fine. If the same program deletes entries from the profile when the iterator is examining them, the iterator can get confused. The simplest case is: Iterate over the list of KDCs for a realm. As each entry is returned, delete it, and save out the result. There should be no KDCs left; instead, the second one is always left. After throwing together a Tcl wrapper (using SWIG) for the profile library API, I've managed to reproduce the problem quite nicely: set x [profile_init /tmp/krb5.conf] puts [list Opened new profile object: $x] set dr [profile_get_string $x libdefaults default_realm] puts [list Default realm is $dr] set kdcs [profile_get_values $x [list realms $dr kdc]] puts [list KDC list: $kdcs] set i [profile_iterator_create $x [list realms $dr kdc] 0] puts [list New iterator over KDC list: $i] set a hello while {[string length [lindex $a 0]]} { set a [profile_iterator $i] puts [list Iterator returns value: $a] } puts done set i [profile_iterator_create $x [list realms $dr kdc] 0] puts [list New iterator over KDC list: $i] set a hello while {[string length [lindex $a 0]]} { set a [profile_iterator $i] puts [list Iterator returns value: $a] set server [lindex $a 1] if [string length $server] { puts [list Deleting node: $server] profile_update_relation $x [list realms $dr kdc] $server set kdcs {} catch { set kdcs [profile_get_values $x [list realms $dr kdc]] } z puts [list New KDC list: $kdcs] } } profile_release $x shows the incorrect result: Opened new profile object: _d0d40508_profile_t Default realm is ATHENA.MIT.EDU KDC list: {kerberos.mit.edu:88 kerberos-1.mit.edu:88 kerberos-2.mit.edu:88 kerberos-3.mit.edu:88} New iterator over KDC list: _20020608_iter_t Iterator returns value: {kdc kerberos.mit.edu:88} Iterator returns value: {kdc kerberos-1.mit.edu:88} Iterator returns value: {kdc kerberos-2.mit.edu:88} Iterator returns value: {kdc kerberos-3.mit.edu:88} Iterator returns value: {{} {}} done New iterator over KDC list: _d85c0608_iter_t Iterator returns value: {kdc kerberos.mit.edu:88} Deleting node: kerberos.mit.edu:88 New KDC list: {kerberos-1.mit.edu:88 kerberos-2.mit.edu:88 kerberos-3.mit.edu:88} *** Note that at this point the iterator should return kerberos-1, but *** never does; hence, the caller doesn't delete it. Iterator returns value: {kdc kerberos-2.mit.edu:88} Deleting node: kerberos-2.mit.edu:88 New KDC list: {kerberos-1.mit.edu:88 kerberos-3.mit.edu:88} Iterator returns value: {kdc kerberos-3.mit.edu:88} Deleting node: kerberos-3.mit.edu:88 New KDC list: kerberos-1.mit.edu:88 Iterator returns value: {{} {}} Ken