summaryrefslogtreecommitdiffstats
path: root/source3/libsmb/clientgen.c
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 /source3/libsmb/clientgen.c
parent7842b391b9ad1f6aaa77c0b8397e1dcc0b79e7e7 (diff)
downloadsamba-d5506215610f95c161ad45dba00a0b180de3a00b.tar.gz
samba-d5506215610f95c161ad45dba00a0b180de3a00b.tar.xz
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)
Diffstat (limited to 'source3/libsmb/clientgen.c')
-rw-r--r--source3/libsmb/clientgen.c46
1 files changed, 24 insertions, 22 deletions
diff --git a/source3/libsmb/clientgen.c b/source3/libsmb/clientgen.c
index 1ea8033fc62..bdc06f1c74e 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.
****************************************************************************/