summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndrew Tridgell <tridge@samba.org>2010-02-06 12:40:38 +1100
committerJeremy Allison <jra@samba.org>2010-02-10 15:38:48 -0800
commitd5506215610f95c161ad45dba00a0b180de3a00b (patch)
tree7dbe2bc9b773601161bf2d656d3c020ae05eb932
parent7842b391b9ad1f6aaa77c0b8397e1dcc0b79e7e7 (diff)
downloadsamba-d5506215610f95c161ad45dba00a0b180de3a00b.tar.gz
samba-d5506215610f95c161ad45dba00a0b180de3a00b.tar.bz2
samba-d5506215610f95c161ad45dba00a0b180de3a00b.zip
s3-libsmb: update libsmb to use new DLIST macros
manipulating p->prev directly is not safe any more (cherry picked from commit 3c650ac1e3e1cdbbabecfddcd29325f20b5dcb48)
-rw-r--r--source3/libsmb/clidfs.c2
-rw-r--r--source3/libsmb/clientgen.c46
2 files changed, 25 insertions, 23 deletions
diff --git a/source3/libsmb/clidfs.c b/source3/libsmb/clidfs.c
index 2a39ee9b58..d9e2b87d10 100644
--- a/source3/libsmb/clidfs.c
+++ b/source3/libsmb/clidfs.c
@@ -351,7 +351,7 @@ static struct cli_state *cli_cm_find(struct cli_state *cli,
}
/* Search to the start of the list. */
- for (p = cli; p; p = p->prev) {
+ for (p = cli; p; p = DLIST_PREV(p)) {
if (strequal(server, p->desthost) &&
strequal(share,p->share)) {
return p;
diff --git a/source3/libsmb/clientgen.c b/source3/libsmb/clientgen.c
index 1ea8033fc6..bdc06f1c74 100644
--- a/source3/libsmb/clientgen.c
+++ b/source3/libsmb/clientgen.c
@@ -693,29 +693,8 @@ void cli_nt_pipes_close(struct cli_state *cli)
Shutdown a client structure.
****************************************************************************/
-void cli_shutdown(struct cli_state *cli)
+static void _cli_shutdown(struct cli_state *cli)
{
- if (cli->prev == NULL) {
- /*
- * Possible head of a DFS list,
- * shutdown all subsidiary DFS
- * connections.
- */
- struct cli_state *p, *next;
-
- for (p = cli->next; p; p = next) {
- next = p->next;
- cli_shutdown(p);
- }
- } else {
- /*
- * We're a subsidiary connection.
- * Just remove ourselves from the
- * DFS list.
- */
- DLIST_REMOVE(cli->prev, cli);
- }
-
cli_nt_pipes_close(cli);
/*
@@ -755,6 +734,29 @@ void cli_shutdown(struct cli_state *cli)
TALLOC_FREE(cli);
}
+void cli_shutdown(struct cli_state *cli)
+{
+ struct cli_state *cli_head;
+ DLIST_HEAD(cli, cli_head);
+ if (cli_head == cli) {
+ /*
+ * head of a DFS list, shutdown all subsidiary DFS
+ * connections.
+ */
+ struct cli_state *p, *next;
+
+ for (p = cli_head->next; p; p = next) {
+ next = p->next;
+ DLIST_REMOVE(cli_head, p);
+ _cli_shutdown(p);
+ }
+ } else {
+ DLIST_REMOVE(cli_head, cli);
+ }
+
+ _cli_shutdown(cli);
+}
+
/****************************************************************************
Set socket options on a open connection.
****************************************************************************/