[SCM] Samba Shared Repository - branch v3-3-test updated -
release-3-2-0pre2-4204-g7378251
Jeremy Allison
jra at samba.org
Wed Oct 1 20:24:08 GMT 2008
The branch, v3-3-test has been updated
via 737825183115732de1f1d6d2bd89ce6402a65b20 (commit)
from 9a90ceac52f8623dde2bf50e630b10aebbc0e28d (commit)
http://gitweb.samba.org/?p=samba.git;a=shortlog;h=v3-3-test
- Log -----------------------------------------------------------------
commit 737825183115732de1f1d6d2bd89ce6402a65b20
Author: Jeremy Allison <jra at samba.org>
Date: Wed Oct 1 13:23:09 2008 -0700
Fix use of DLIST_REMOVE as spotted by Constantine Vetoshev <gepardcv at gmail.com>.
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 b9433bb..7f34d2b 100644
--- a/source/smbd/conn.c
+++ b/source/smbd/conn.c
@@ -252,8 +252,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 ce24c7c..e684a07 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 7847d1d..ebcf625 100644
--- a/source/winbindd/winbindd_util.c
+++ b/source/winbindd/winbindd_util.c
@@ -1075,13 +1075,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
More information about the samba-cvs
mailing list