The branch, v3-2-test has been updated
       via  347fc4ed725083f2c520afc39f7c81db0dd60324 (commit)
      from  7ea95c19305a2fb6efc95acc4e96f083e31f6c6f (commit)

http://gitweb.samba.org/?p=samba.git;a=shortlog;h=v3-2-test


- Log -----------------------------------------------------------------
commit 347fc4ed725083f2c520afc39f7c81db0dd60324
Author: Jeremy Allison <[EMAIL PROTECTED]>
Date:   Wed Oct 1 13:22:02 2008 -0700

    Fix use of DLIST_REMOVE as spotted by Constantine Vetoshev <[EMAIL 
PROTECTED]>.
    This API is unusual in that if used to remove a non-list head it nulls out
    the next and prev pointers. This is what you want for debugging (don't want
    an entry removed from the list to be still virtually linked into it) but
    means there is no consistent idiom for use as the next and prev pointers
    get trashed on removal from the list, meaning you must save them yourself.
    You can use it one way when deleting everything via the head pointer, as
    this preserves the next pointer, but you *must* use it another way when not
    deleting everything via the head pointer. Fix all known uses of this (the 
main
    one is in conn_free_internal() and would not free all the private data 
entries
    for vfs modules. The other changes in web/statuspage.c and winbindd_util.c
    are not strictly neccessary, as the head pointer is being used, but I've 
done
    them for consistency. Long term we must revisit this as this API is too hard
    to use correctly.
    Jeremy.

-----------------------------------------------------------------------

Summary of changes:
 source/smbd/conn.c              |    2 +-
 source/web/statuspage.c         |    5 +++--
 source/winbindd/winbindd_util.c |    3 +--
 3 files changed, 5 insertions(+), 5 deletions(-)


Changeset truncated at 500 lines:

diff --git a/source/smbd/conn.c b/source/smbd/conn.c
index c5a2df4..cfcec51 100644
--- a/source/smbd/conn.c
+++ b/source/smbd/conn.c
@@ -267,8 +267,8 @@ void conn_free_internal(connection_struct *conn)
        /* Free vfs_connection_struct */
        handle = conn->vfs_handles;
        while(handle) {
-               DLIST_REMOVE(conn->vfs_handles, handle);
                thandle = handle->next;
+               DLIST_REMOVE(conn->vfs_handles, handle);
                if (handle->free_data)
                        handle->free_data(&handle->data);
                handle = thandle;
diff --git a/source/web/statuspage.c b/source/web/statuspage.c
index eda53b6..5d9a239 100644
--- a/source/web/statuspage.c
+++ b/source/web/statuspage.c
@@ -43,9 +43,10 @@ static void initPid2Machine (void)
 {
        /* show machine name rather PID on table "Open Files"? */
        if (PID_or_Machine) {
-               PIDMAP *p;
+               PIDMAP *p, *next;
 
-               for (p = pidmap; p != NULL; ) {
+               for (p = pidmap; p != NULL; p = next) {
+                       next = p->next;
                        DLIST_REMOVE(pidmap, p);
                        SAFE_FREE(p->machine);
                        SAFE_FREE(p);
diff --git a/source/winbindd/winbindd_util.c b/source/winbindd/winbindd_util.c
index 3425b4c..cf7663d 100644
--- a/source/winbindd/winbindd_util.c
+++ b/source/winbindd/winbindd_util.c
@@ -1042,13 +1042,12 @@ void free_getent_state(struct getent_state *state)
        temp = state;
 
        while(temp != NULL) {
-               struct getent_state *next;
+               struct getent_state *next = temp->next;
 
                /* Free sam entries then list entry */
 
                SAFE_FREE(state->sam_entries);
                DLIST_REMOVE(state, state);
-               next = temp->next;
 
                SAFE_FREE(temp);
                temp = next;


-- 
Samba Shared Repository

Reply via email to