From d5506215610f95c161ad45dba00a0b180de3a00b Mon Sep 17 00:00:00 2001 From: Andrew Tridgell Date: Sat, 6 Feb 2010 12:40:38 +1100 Subject: s3-libsmb: update libsmb to use new DLIST macros manipulating p->prev directly is not safe any more (cherry picked from commit 3c650ac1e3e1cdbbabecfddcd29325f20b5dcb48) --- source3/libsmb/clidfs.c | 2 +- source3/libsmb/clientgen.c | 46 ++++++++++++++++++++++++---------------------- 2 files changed, 25 insertions(+), 23 deletions(-) (limited to 'source3') 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. ****************************************************************************/ -- cgit