s4-ldbwrap: ensure session_info in ldb opaque remains valid
authorAndrew Tridgell <tridge@samba.org>
Tue, 17 Aug 2010 08:29:42 +0000 (18:29 +1000)
committerAndrew Tridgell <tridge@samba.org>
Tue, 17 Aug 2010 11:21:51 +0000 (21:21 +1000)
A DRS DsBind handle can be re-used in a later connection. This implies
reuse of the session_info for the connection. If the first connection
is shutdown then the session_info in the sam context on the 2nd
connection must remain valid.

source4/lib/ldb-samba/ldb_wrap.c

index 365b67b6afa3549861bdfeb2d22d54d5bade2512..13ab3edefe8f3deb23fea2cfbe9a8b515856b60c 100644 (file)
@@ -248,6 +248,21 @@ static int ldb_wrap_destructor(struct ldb_wrap *w)
                return NULL;
        }
 
+       if (session_info) {
+               /* take a reference to the session_info, as it is
+                * possible for the ldb to live longer than the
+                * session_info. This happens when a DRS DsBind call
+                * reuses a handle, but the original connection is
+                * shutdown. The token for the new connection is still
+                * valid, so we need the session_info to remain valid for
+                * ldb modules to use
+                */
+               if (talloc_reference(w, session_info) == NULL) {
+                       talloc_free(ldb);
+                       return NULL;
+               }
+       }
+
        w->ldb = ldb;
 
        DLIST_ADD(ldb_wrap_list, w);