identify nspi session by their policy_handle + dont return status codes on the stack...
authorwsourdeau <wsourdeau@71d39326-ef09-db11-b2a4-00e04c779ad1>
Fri, 7 Jan 2011 19:55:01 +0000 (19:55 +0000)
committerwsourdeau <wsourdeau@71d39326-ef09-db11-b2a4-00e04c779ad1>
Fri, 7 Jan 2011 19:55:01 +0000 (19:55 +0000)
git-svn-id: https://svn.openchange.org/openchange@2494 71d39326-ef09-db11-b2a4-00e04c779ad1

branches/sogo/mapiproxy/servers/default/nspi/dcesrv_exchange_nsp.c
branches/sogo/mapiproxy/servers/default/nspi/dcesrv_exchange_nsp.h

index ed023f5ce32f5e657aa6df7939322da7f636d5d7..323000e0f06fca9e1c3120bb2b2152d4910a1ecb 100644 (file)
 #include "mapiproxy/dcesrv_mapiproxy.h"
 #include "dcesrv_exchange_nsp.h"
 
-struct exchange_nsp_session    *nsp_session = NULL;
-TDB_CONTEXT                    *emsabp_tdb_ctx = NULL;
+static struct exchange_nsp_session     *nsp_session = NULL;
+static TDB_CONTEXT                     *emsabp_tdb_ctx = NULL;
+
+static bool dcesrv_uuid_matches(const struct GUID *uuid1, const struct GUID *uuid2)
+{
+       bool rc;
+       void *mem_ctx;
+
+       rc = (uuid1 == uuid2
+             || ((uuid1 != NULL) && (uuid2 != NULL)
+                 && (uuid1->time_low == uuid2->time_low)
+                 && (uuid1->time_mid == uuid2->time_mid)
+                 && (uuid1->time_hi_and_version == uuid2->time_hi_and_version)
+                 && (strncmp((const char *) uuid1->clock_seq, (const char *) uuid2->clock_seq, 2) == 0)
+                 && (strncmp((const char *) uuid1->node, (const char *) uuid2->node, 6) == 0)));
+
+       /* mem_ctx = talloc_zero_size(NULL, 0); */
+       /* DEBUG(5, ("dcesrv_uuid_matches: uuids %s and %s %s\n", */
+       /*        GUID_string(mem_ctx, uuid1), GUID_string(mem_ctx, uuid2), */
+       /*        rc ? "match" : "do not match")); */
+       /* talloc_free(mem_ctx); */
+       
+       return rc;
+}
+
+static struct exchange_nsp_session *dcesrv_find_nsp_session(struct GUID *uuid)
+{
+       struct exchange_nsp_session     *session, *found_session = NULL;
+
+       for (session = nsp_session; !found_session && session; session = session->next) {
+               if (dcesrv_uuid_matches(uuid, &session->uuid)) {
+                       found_session = session;
+               }
+       }
+
+       return found_session;
+}
+
+static struct emsabp_context *dcesrv_find_emsabp_context(struct GUID *uuid)
+{
+       struct exchange_nsp_session     *session;
+       struct emsabp_context           *emsabp_ctx = NULL;
+
+       session = dcesrv_find_nsp_session(uuid);
+       if (session) {
+               emsabp_ctx = (struct emsabp_context *)session->session->private_data;;
+       }
+
+       return emsabp_ctx;
+}
 
 /**
    \details exchange_nsp NspiBind (0x0) function, Initiates a NSPI
@@ -46,7 +94,7 @@ TDB_CONTEXT                   *emsabp_tdb_ctx = NULL;
 
    \return MAPI_E_SUCCESS on success, otherwise a MAPI error
  */
-static enum MAPISTATUS dcesrv_NspiBind(struct dcesrv_call_state *dce_call,
+static void dcesrv_NspiBind(struct dcesrv_call_state *dce_call,
                                       TALLOC_CTX *mem_ctx,
                                       struct NspiBind *r)
 {
@@ -55,7 +103,6 @@ static enum MAPISTATUS dcesrv_NspiBind(struct dcesrv_call_state *dce_call,
        struct dcesrv_handle            *handle;
        struct policy_handle            wire_handle;
        struct exchange_nsp_session     *session;
-       bool                            found = false;
 
        DEBUG(5, ("exchange_nsp: NspiBind (0x0)\n"));
 
@@ -68,15 +115,14 @@ static enum MAPISTATUS dcesrv_NspiBind(struct dcesrv_call_state *dce_call,
                *r->out.handle = wire_handle;
 
                r->out.mapiuid = r->in.mapiuid;
-               r->out.result = MAPI_E_LOGON_FAILED;
-               return MAPI_E_LOGON_FAILED;             
+               DCESRV_NSP_RETURN(r, MAPI_E_FAILONEPROVIDER, NULL);
        }
 
        /* Step 1. Initialize the emsabp context */
        emsabp_ctx = emsabp_init(dce_call->conn->dce_ctx->lp_ctx, emsabp_tdb_ctx);
        if (!emsabp_ctx) {
                smb_panic("unable to initialize emsabp context");
-               OPENCHANGE_RETVAL_IF(!emsabp_ctx, MAPI_E_FAILONEPROVIDER, NULL);
+               DCESRV_NSP_RETURN(r, MAPI_E_FAILONEPROVIDER, NULL);
        }
 
        /* Step 2. Check if incoming user belongs to the Exchange organization */
@@ -88,8 +134,7 @@ static enum MAPISTATUS dcesrv_NspiBind(struct dcesrv_call_state *dce_call,
                *r->out.handle = wire_handle;
 
                r->out.mapiuid = r->in.mapiuid;
-               r->out.result = MAPI_E_LOGON_FAILED;
-               return MAPI_E_LOGON_FAILED;
+               DCESRV_NSP_RETURN(r, MAPI_E_LOGON_FAILED, emsabp_tdb_ctx);
        }
 
        /* Step 3. Check if valid cpID has been supplied */
@@ -101,42 +146,46 @@ static enum MAPISTATUS dcesrv_NspiBind(struct dcesrv_call_state *dce_call,
                *r->out.handle = wire_handle;
 
                r->out.mapiuid = r->in.mapiuid;
-               r->out.result = MAPI_E_UNKNOWN_CPID;
-               return MAPI_E_UNKNOWN_CPID;
+               DCESRV_NSP_RETURN(r, MAPI_E_UNKNOWN_CPID, emsabp_tdb_ctx);
        }
 
        /* Step 4. Retrieve OpenChange server GUID */
        guid = (struct GUID *) samdb_ntds_objectGUID(emsabp_ctx->samdb_ctx);
-       OPENCHANGE_RETVAL_IF(!guid, MAPI_E_FAILONEPROVIDER, emsabp_ctx);
+       if (!guid) {
+               DCESRV_NSP_RETURN(r, MAPI_E_FAILONEPROVIDER, emsabp_ctx);
+       }
 
        /* Step 5. Fill NspiBind reply */
        handle = dcesrv_handle_new(dce_call->context, EXCHANGE_HANDLE_NSP);
-       OPENCHANGE_RETVAL_IF(!handle, MAPI_E_NOT_ENOUGH_RESOURCES, emsabp_ctx);
+       if (!handle) {
+               DCESRV_NSP_RETURN(r, MAPI_E_NOT_ENOUGH_RESOURCES, emsabp_ctx);
+       }
 
        handle->data = (void *) emsabp_ctx;
        *r->out.handle = handle->wire_handle;
        r->out.mapiuid = guid;
-       r->out.result = MAPI_E_SUCCESS;
 
        /* Search for an existing session and increment ref_count, otherwise create it */
-       for (session = nsp_session; !found && session; session = session->next) {
-               if ((mpm_session_cmp(session->session, dce_call) == true)) {
-                       mpm_session_increment_ref_count(session->session);
-                       found = true;
-                       break;
-               }
+       session = dcesrv_find_nsp_session(&handle->wire_handle.uuid);
+       if (session) {
+               mpm_session_increment_ref_count(session->session);
+               DEBUG(5, ("  [unexpected]: existing nsp_session: %p; session: %p (ref++)\n", session, session->session));
        }
+       else {
+               DEBUG(0, ("Creating new session\n"));
 
-       if (found == false) {
                /* Step 6. Associate this emsabp context to the session */
                session = talloc((TALLOC_CTX *)nsp_session, struct exchange_nsp_session);
-               OPENCHANGE_RETVAL_IF(!session, MAPI_E_NOT_ENOUGH_RESOURCES, emsabp_ctx);
+               if (!session) {
+                       DCESRV_NSP_RETURN(r, MAPI_E_NOT_ENOUGH_RESOURCES, emsabp_ctx);
+               }
 
-               DEBUG(0, ("Creating new session\n"));
                session->session = mpm_session_init((TALLOC_CTX *)nsp_session, dce_call);
-               OPENCHANGE_RETVAL_IF(!session->session, MAPI_E_NOT_ENOUGH_RESOURCES, emsabp_ctx);
+               if (!session->session) {
+                       DCESRV_NSP_RETURN(r, MAPI_E_NOT_ENOUGH_RESOURCES, emsabp_ctx);
+               }
 
-               DEBUG(0, ("  session is %p\n", session->session));
+               session->uuid = handle->wire_handle.uuid;
 
                mpm_session_set_private_data(session->session, (void *) emsabp_ctx);
                mpm_session_set_destructor(session->session, emsabp_destructor);
@@ -144,7 +193,7 @@ static enum MAPISTATUS dcesrv_NspiBind(struct dcesrv_call_state *dce_call,
                DLIST_ADD_END(nsp_session, session, struct exchange_nsp_session *);
        }
 
-       return MAPI_E_SUCCESS;
+       DCESRV_NSP_RETURN(r, MAPI_E_SUCCESS, NULL);
 }
 
 
@@ -156,46 +205,45 @@ static enum MAPISTATUS dcesrv_NspiBind(struct dcesrv_call_state *dce_call,
    \param mem_ctx pointer to the memory context
    \param r pointer to the NspiUnbind call structure
  */
-static enum MAPISTATUS dcesrv_NspiUnbind(struct dcesrv_call_state *dce_call,
+static void dcesrv_NspiUnbind(struct dcesrv_call_state *dce_call,
                                         TALLOC_CTX *mem_ctx,
                                         struct NspiUnbind *r)
 {
        struct dcesrv_handle            *h;
        struct exchange_nsp_session     *session;
-       bool                            ret, found;
+       bool                            ret;
 
        DEBUG(5, ("exchange_nsp: NspiUnbind (0x1)\n"));
 
        /* Step 0. Ensure incoming user is authenticated */
        if (!NTLM_AUTH_IS_OK(dce_call)) {
                DEBUG(1, ("No challenge requested by client, cannot authenticate\n"));
-               return MAPI_E_LOGON_FAILED;
+               DCESRV_NSP_RETURN(r, MAPI_E_LOGON_FAILED, NULL);
        }
 
        /* Step 1. Retrieve handle and free if emsabp context and session are available */
        h = dcesrv_handle_fetch(dce_call->context, r->in.handle, DCESRV_HANDLE_ANY);
        if (h) {
-               found = false;
-               for (session = nsp_session; !found && session; session = session->next) {
-                       found = mpm_session_cmp(session->session, dce_call);
-                       if (found) {
-                               ret = mpm_session_release(session->session);
-                               if (ret == true) {
-                                       DLIST_REMOVE(nsp_session, session);
-                                       DEBUG(0, ("[%s:%d]: Session found and released\n", 
-                                                 __FUNCTION__, __LINE__));
-                               } else {
-                                       DEBUG(0, ("[%s:%d]: Session found and ref_count decreased\n",
-                                                 __FUNCTION__, __LINE__));
-                               }
-                               break;
+               session = dcesrv_find_nsp_session(&r->in.handle->uuid);
+               if (session) {
+                       ret = mpm_session_release(session->session);
+                       if (ret == true) {
+                               DLIST_REMOVE(nsp_session, session);
+                               DEBUG(0, ("[%s:%d]: Session found and released\n", 
+                                         __FUNCTION__, __LINE__));
+                       } else {
+                               DEBUG(0, ("[%s:%d]: Session found and ref_count decreased\n",
+                                         __FUNCTION__, __LINE__));
                        }
                }
+               else {
+                       DEBUG(5, ("  nsp_session NOT found\n"));
+               }
        }
 
        r->out.result = 1;
 
-       return MAPI_E_SUCCESS;
+       DCESRV_NSP_RETURN(r, MAPI_E_SUCCESS, NULL);
 }
 
 
@@ -208,15 +256,14 @@ static enum MAPISTATUS dcesrv_NspiUnbind(struct dcesrv_call_state *dce_call,
 
    \return MAPI_E_SUCCESS on success
 */
-static enum MAPISTATUS dcesrv_NspiUpdateStat(struct dcesrv_call_state *dce_call, 
+static void dcesrv_NspiUpdateStat(struct dcesrv_call_state *dce_call, 
                                             TALLOC_CTX *mem_ctx,
                                             struct NspiUpdateStat *r)
 {
        DEBUG(3, ("exchange_nsp: NspiUpdateStat (0x2) not implemented\n"));
-       DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
+       DCESRV_NSP_RETURN(r, DCERPC_FAULT_OP_RNG_ERROR, NULL);
 }
 
-
 /**
    \details exchange_nsp NspiQueryRows (0x3) function
 
@@ -226,35 +273,29 @@ static enum MAPISTATUS dcesrv_NspiUpdateStat(struct dcesrv_call_state *dce_call,
 
    \return MAPI_E_SUCCESS on success
  */
-static enum MAPISTATUS dcesrv_NspiQueryRows(struct dcesrv_call_state *dce_call,
-                                           TALLOC_CTX *mem_ctx,
-                                           struct NspiQueryRows *r)
+static void dcesrv_NspiQueryRows(struct dcesrv_call_state *dce_call,
+                                TALLOC_CTX *mem_ctx,
+                                struct NspiQueryRows *r)
 {
        enum MAPISTATUS                 retval = MAPI_E_SUCCESS;
-       struct exchange_nsp_session     *session;
        struct emsabp_context           *emsabp_ctx = NULL;
        struct SPropTagArray            *pPropTags;
        struct SRowSet                  *pRows;
        uint32_t                        i;
-       bool                            found = false;
 
        DEBUG(3, ("exchange_nsp: NspiQueryRows (0x3)\n"));
 
        /* Step 0. Ensure incoming user is authenticated */
        if (!NTLM_AUTH_IS_OK(dce_call)) {
                DEBUG(1, ("No challenge requested by client, cannot authenticate\n"));
-               return MAPI_E_LOGON_FAILED;
+               DCESRV_NSP_RETURN(r, MAPI_E_LOGON_FAILED, NULL);
        }
 
-       for (session = nsp_session; !found && session; session = session->next) {
-               if ((mpm_session_cmp(session->session, dce_call)) == true) {
-                       emsabp_ctx = (struct emsabp_context *)session->session->private_data;
-                       found = true;
-               }
+       emsabp_ctx = dcesrv_find_emsabp_context(&r->in.handle->uuid);
+       if (!emsabp_ctx) {
+               DCESRV_NSP_RETURN(r, MAPI_E_CALL_FAILED, NULL);
        }
 
-       OPENCHANGE_RETVAL_IF(found == false, MAPI_E_LOGON_FAILED, NULL);
-
        /* Step 1. Sanity Checks (MS-NSPI Server Processing Rules) */
        if (r->in.pStat->ContainerID && (emsabp_tdb_lookup_MId(emsabp_ctx->tdb_ctx, r->in.pStat->ContainerID) == false)) {
                retval = MAPI_E_INVALID_BOOKMARK;
@@ -320,14 +361,11 @@ static enum MAPISTATUS dcesrv_NspiQueryRows(struct dcesrv_call_state *dce_call,
        r->out.pStat->NumPos = r->out.pStat->Delta + pRows->cRows;
        r->out.pStat->CurrentRec = MID_END_OF_TABLE;
 
-       return MAPI_E_SUCCESS;
-
+       DCESRV_NSP_RETURN(r, MAPI_E_SUCCESS, NULL);
 failure:
        r->out.pStat = r->in.pStat;
        *r->out.ppRows = NULL;
-       r->out.result = retval;
-
-       return retval;
+       DCESRV_NSP_RETURN(r, retval, NULL);
 }
 
 
@@ -340,12 +378,12 @@ failure:
 
    \return MAPI_E_SUCCESS on success
  */
-static enum MAPISTATUS dcesrv_NspiSeekEntries(struct dcesrv_call_state *dce_call,
+static void dcesrv_NspiSeekEntries(struct dcesrv_call_state *dce_call,
                                              TALLOC_CTX *mem_ctx,
                                              struct NspiSeekEntries *r)
 {
        DEBUG(3, ("exchange_nsp: NspiSeekEntries (0x4) not implemented\n"));
-       DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
+       DCESRV_NSP_RETURN(r, DCERPC_FAULT_OP_RNG_ERROR, NULL);
 }
 
 
@@ -358,16 +396,14 @@ static enum MAPISTATUS dcesrv_NspiSeekEntries(struct dcesrv_call_state *dce_call
 
    \return MAPI_E_SUCCESS on success
  */
-static enum MAPISTATUS dcesrv_NspiGetMatches(struct dcesrv_call_state *dce_call,
+static void dcesrv_NspiGetMatches(struct dcesrv_call_state *dce_call,
                                             TALLOC_CTX *mem_ctx,
                                             struct NspiGetMatches *r)
 {
        enum MAPISTATUS                 retval;
-       struct exchange_nsp_session     *session;
        struct emsabp_context           *emsabp_ctx = NULL;
        struct SPropTagArray            *ppOutMIds = NULL;
        uint32_t                        i;
-       bool                            found = false;
        
 
        DEBUG(3, ("exchange_nsp: NspiGetMatches (0x5)\n"));
@@ -375,18 +411,14 @@ static enum MAPISTATUS dcesrv_NspiGetMatches(struct dcesrv_call_state *dce_call,
        /* Step 0. Ensure incoming user is authenticated */
        if (!NTLM_AUTH_IS_OK(dce_call)) {
                DEBUG(1, ("No challenge requested by client, cannot authenticate\n"));
-               return MAPI_E_LOGON_FAILED;
+               DCESRV_NSP_RETURN(r, MAPI_E_LOGON_FAILED, NULL);
        }
 
-       for (session = nsp_session; !found && session; session = session->next) {
-               found = mpm_session_cmp(session->session, dce_call);
-               if (found == true) {
-                       emsabp_ctx = (struct emsabp_context *)session->session->private_data;
-               }
+       emsabp_ctx = dcesrv_find_emsabp_context(&r->in.handle->uuid);
+       if (!emsabp_ctx) {
+               DCESRV_NSP_RETURN(r, MAPI_E_CALL_FAILED, NULL);
        }
 
-       OPENCHANGE_RETVAL_IF(found == false, MAPI_E_LOGON_FAILED, NULL);
-
        /* Step 1. Retrieve MIds array given search criterias */
        ppOutMIds = talloc_zero(mem_ctx, struct SPropTagArray);
        ppOutMIds->cValues = 0;
@@ -399,9 +431,7 @@ static enum MAPISTATUS dcesrv_NspiGetMatches(struct dcesrv_call_state *dce_call,
                *r->out.ppOutMIds = ppOutMIds;  
                r->out.ppRows = talloc(mem_ctx, struct SRowSet *);
                r->out.ppRows[0] = NULL;
-               r->out.result = retval;
-               
-               return retval;
+               DCESRV_NSP_RETURN(r, retval, NULL);
        }
 
        *r->out.ppOutMIds = ppOutMIds;
@@ -416,12 +446,13 @@ static enum MAPISTATUS dcesrv_NspiGetMatches(struct dcesrv_call_state *dce_call,
        for (i = 0; i < ppOutMIds->cValues; i++) {
                retval = emsabp_fetch_attrs(mem_ctx, emsabp_ctx, &(r->out.ppRows[0]->aRow[i]), 
                                            ppOutMIds->aulPropTag[i], fEphID, r->in.pPropTags);
-               if (retval) goto failure;
+               if (retval) {
+                       DEBUG(5, ("failure looking up value %d\n", i));
+                       goto failure;
+               }
        }
 
-       r->out.result = MAPI_E_SUCCESS;
-
-       return MAPI_E_SUCCESS;
+       DCESRV_NSP_RETURN(r, MAPI_E_SUCCESS, NULL);
 }
 
 
@@ -434,12 +465,12 @@ static enum MAPISTATUS dcesrv_NspiGetMatches(struct dcesrv_call_state *dce_call,
 
    \return MAPI_E_SUCCESS on success
  */
-static enum MAPISTATUS dcesrv_NspiResortRestriction(struct dcesrv_call_state *dce_call,
+static void dcesrv_NspiResortRestriction(struct dcesrv_call_state *dce_call,
                                                    TALLOC_CTX *mem_ctx,
                                                    struct NspiResortRestriction *r)
 {
        DEBUG(3, ("exchange_nsp: NspiResortRestriction (0x6) not implemented\n"));
-       DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
+       DCESRV_NSP_RETURN(r, DCERPC_FAULT_OP_RNG_ERROR, NULL);
 }
 
 
@@ -455,38 +486,30 @@ static enum MAPISTATUS dcesrv_NspiResortRestriction(struct dcesrv_call_state *dc
 
    \return MAPI_E_SUCCESS on success
  */
-static enum MAPISTATUS dcesrv_NspiDNToMId(struct dcesrv_call_state *dce_call,
+static void dcesrv_NspiDNToMId(struct dcesrv_call_state *dce_call,
                                          TALLOC_CTX *mem_ctx,
                                          struct NspiDNToMId *r)
 {
        enum MAPISTATUS                 retval;
-       struct exchange_nsp_session     *session;
        struct emsabp_context           *emsabp_ctx = NULL;
        struct ldb_message              *msg;
        uint32_t                        i;
        uint32_t                        MId;
        const char                      *dn;
        bool                            pbUseConfPartition;
-       bool                            found = false;
 
        DEBUG(3, ("exchange_nsp: NspiDNToMId (0x7)\n"));
 
        /* Step 0. Ensure incoming user is authenticated */
        if (!NTLM_AUTH_IS_OK(dce_call)) {
                DEBUG(1, ("No challenge requested by client, cannot authenticate\n"));
-               return MAPI_E_LOGON_FAILED;
+               DCESRV_NSP_RETURN(r, MAPI_E_LOGON_FAILED, NULL);
        }
 
-       for (session = nsp_session; !found && session; session = session->next) {
-               DEBUG(0, ("  comparing session %p with dce_call %p\n",
-                         session->session, dce_call));
-               if ((mpm_session_cmp(session->session, dce_call)) == true) {
-                       emsabp_ctx = (struct emsabp_context *)session->session->private_data;
-                       found = true;
-               }
+       emsabp_ctx = dcesrv_find_emsabp_context(&r->in.handle->uuid);
+       if (!emsabp_ctx) {
+               DCESRV_NSP_RETURN(r, MAPI_E_CALL_FAILED, NULL);
        }
-
-       OPENCHANGE_RETVAL_IF(found == false, MAPI_E_LOGON_FAILED, NULL);
        
        r->out.ppMIds = talloc_array(mem_ctx, struct SPropTagArray *, 2);
        r->out.ppMIds[0] = talloc_zero(mem_ctx, struct SPropTagArray);
@@ -510,9 +533,7 @@ static enum MAPISTATUS dcesrv_NspiDNToMId(struct dcesrv_call_state *dce_call,
                }
        }
 
-       r->out.result = MAPI_E_SUCCESS;
-
-       return MAPI_E_SUCCESS;
+       DCESRV_NSP_RETURN(r, MAPI_E_SUCCESS, NULL);
 }
 
 
@@ -525,12 +546,12 @@ static enum MAPISTATUS dcesrv_NspiDNToMId(struct dcesrv_call_state *dce_call,
 
    \return MAPI_E_SUCCESS on success
  */
-static enum MAPISTATUS dcesrv_NspiGetPropList(struct dcesrv_call_state *dce_call,
+static void dcesrv_NspiGetPropList(struct dcesrv_call_state *dce_call,
                                              TALLOC_CTX *mem_ctx,
                                              struct NspiGetPropList *r)
 {
        DEBUG(3, ("exchange_nsp: NspiGetPropList (0x8) not implemented\n"));
-       DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
+       DCESRV_NSP_RETURN(r, DCERPC_FAULT_OP_RNG_ERROR, NULL);
 }
 
 
@@ -543,41 +564,33 @@ static enum MAPISTATUS dcesrv_NspiGetPropList(struct dcesrv_call_state *dce_call
 
    \return MAPI_E_SUCCESS on success
  */
-static enum MAPISTATUS dcesrv_NspiGetProps(struct dcesrv_call_state *dce_call,
+static void dcesrv_NspiGetProps(struct dcesrv_call_state *dce_call,
                                           TALLOC_CTX *mem_ctx,
                                           struct NspiGetProps *r)
 {
        enum MAPISTATUS                 retval;
-       struct exchange_nsp_session     *session;
        struct emsabp_context           *emsabp_ctx = NULL;
        uint32_t                        MId;
        int                             i;
-       bool                            found = false;
 
        DEBUG(3, ("exchange_nsp: NspiGetProps (0x9)\n"));
 
        /* Step 0. Ensure incoming user is authenticated */
        if (!NTLM_AUTH_IS_OK(dce_call)) {
                DEBUG(1, ("No challenge requested by client, cannot authenticate\n"));
-               return MAPI_E_LOGON_FAILED;
+               DCESRV_NSP_RETURN(r, MAPI_E_LOGON_FAILED, NULL);
        }
 
-       for (session = nsp_session; !found && session; session = session->next) {
-               found = mpm_session_cmp(session->session, dce_call);
-               if (found) {
-                       emsabp_ctx = (struct emsabp_context *)session->session->private_data;
-               }
+       emsabp_ctx = dcesrv_find_emsabp_context(&r->in.handle->uuid);
+       if (!emsabp_ctx) {
+               DCESRV_NSP_RETURN(r, MAPI_E_CALL_FAILED, NULL);
        }
 
-       OPENCHANGE_RETVAL_IF(found == false, MAPI_E_LOGON_FAILED, NULL);
-
        MId = r->in.pStat->CurrentRec;
        
        /* Step 1. Sanity Checks (MS-NSPI Server Processing Rules) */
        if (r->in.pStat->ContainerID && (emsabp_tdb_lookup_MId(emsabp_ctx->tdb_ctx, r->in.pStat->ContainerID) == false)) {
-               retval = MAPI_E_INVALID_BOOKMARK;
-               r->out.result = retval;
-               return retval;
+               DCESRV_NSP_RETURN(r, MAPI_E_INVALID_BOOKMARK, NULL);
        }
 
        /* Step 2. Fetch properties */
@@ -609,8 +622,7 @@ static enum MAPISTATUS dcesrv_NspiGetProps(struct dcesrv_call_state *dce_call,
                        talloc_free(r->out.ppRows);
                        r->out.ppRows = NULL;
                }
-               r->out.result = retval;
-               return r->out.result;
+               DCESRV_NSP_RETURN(r, retval, NULL);
        }
 
        /* Step 3. Properties are fetched. Provide proper return
@@ -623,8 +635,7 @@ static enum MAPISTATUS dcesrv_NspiGetProps(struct dcesrv_call_state *dce_call,
                }
        }
 
-       r->out.result = retval;
-       return retval;
+       DCESRV_NSP_RETURN(r, retval, NULL);
 }
 
 
@@ -637,12 +648,12 @@ static enum MAPISTATUS dcesrv_NspiGetProps(struct dcesrv_call_state *dce_call,
 
    \return MAPI_E_SUCCESS on success
 */
-static enum MAPISTATUS dcesrv_NspiCompareMIds(struct dcesrv_call_state *dce_call,
+static void dcesrv_NspiCompareMIds(struct dcesrv_call_state *dce_call,
                                              TALLOC_CTX *mem_ctx,
                                              struct NspiCompareMIds *r)
 {
        DEBUG(3, ("exchange_nsp: NspiCompareMIds (0xA) not implemented\n"));
-       DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
+       DCESRV_NSP_RETURN(r, DCERPC_FAULT_OP_RNG_ERROR, NULL);
 }
 
 
@@ -656,12 +667,12 @@ static enum MAPISTATUS dcesrv_NspiCompareMIds(struct dcesrv_call_state *dce_call
    \return MAPI_E_SUCCESS on success
 
  */
-static enum MAPISTATUS dcesrv_NspiModProps(struct dcesrv_call_state *dce_call,
+static void dcesrv_NspiModProps(struct dcesrv_call_state *dce_call,
                                           TALLOC_CTX *mem_ctx,
                                           struct NspiModProps *r)
 {
        DEBUG(3, ("exchange_nsp: NspiModProps (0xB) not implemented\n"));
-       DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
+       DCESRV_NSP_RETURN(r, DCERPC_FAULT_OP_RNG_ERROR, NULL);
 }
 
 
@@ -679,41 +690,38 @@ static enum MAPISTATUS dcesrv_NspiModProps(struct dcesrv_call_state *dce_call,
    \return MAPI_E_SUCCESS on success
 
  */
-static enum MAPISTATUS dcesrv_NspiGetSpecialTable(struct dcesrv_call_state *dce_call,
-                                                 TALLOC_CTX *mem_ctx,
-                                                 struct NspiGetSpecialTable *r)
+static void dcesrv_NspiGetSpecialTable(struct dcesrv_call_state *dce_call,
+                                      TALLOC_CTX *mem_ctx,
+                                      struct NspiGetSpecialTable *r)
 {
-       struct exchange_nsp_session     *session;
        struct emsabp_context           *emsabp_ctx = NULL;
-       bool                            found = false;
 
        DEBUG(3, ("exchange_nsp: NspiGetSpecialTable (0xC)\n"));
 
        /* Step 0. Ensure incoming user is authenticated */
        if (!NTLM_AUTH_IS_OK(dce_call)) {
                DEBUG(1, ("No challenge requested by client, cannot authenticate\n"));
-               return MAPI_E_LOGON_FAILED;
+               DCESRV_NSP_RETURN(r, MAPI_E_LOGON_FAILED, NULL);
        }
 
-       for (session = nsp_session; !found && session; session = session->next) {
-               found = mpm_session_cmp(session->session, dce_call);
-               if (found == true) {
-                       emsabp_ctx = (struct emsabp_context *)session->session->private_data;
-                       found = true;
-               }
+       emsabp_ctx = dcesrv_find_emsabp_context(&r->in.handle->uuid);
+       if (!emsabp_ctx) {
+               DCESRV_NSP_RETURN(r, MAPI_E_CALL_FAILED, NULL);
        }
 
-       OPENCHANGE_RETVAL_IF(found == false, MAPI_E_LOGON_FAILED, NULL);
-
        /* Step 1. (FIXME) We arbitrary set lpVersion to 0x1 */
        r->out.lpVersion = talloc_zero(mem_ctx, uint32_t);
        *r->out.lpVersion = 0x1;
 
        /* Step 2. Allocate output SRowSet and call associated emsabp function */
        r->out.ppRows = talloc_zero(mem_ctx, struct SRowSet *);
-       OPENCHANGE_RETVAL_IF(!r->out.ppRows, MAPI_E_NOT_ENOUGH_RESOURCES, NULL);
+       if (!r->out.ppRows) {
+               DCESRV_NSP_RETURN(r, MAPI_E_NOT_ENOUGH_RESOURCES, NULL);
+       }
        r->out.ppRows[0] = talloc_zero(mem_ctx, struct SRowSet);
-       OPENCHANGE_RETVAL_IF(!r->out.ppRows[0], MAPI_E_NOT_ENOUGH_RESOURCES, NULL);
+       if (!r->out.ppRows[0]) {
+               DCESRV_NSP_RETURN(r, MAPI_E_NOT_ENOUGH_RESOURCES, NULL);
+       }
 
        switch (r->in.dwFlags) {
        case NspiAddressCreationTemplates:
@@ -729,10 +737,8 @@ static enum MAPISTATUS dcesrv_NspiGetSpecialTable(struct dcesrv_call_state *dce_
        default:
                talloc_free(r->out.ppRows);
                talloc_free(r->out.ppRows[0]);
-               return MAPI_E_NO_SUPPORT;
+               DCESRV_NSP_RETURN(r, MAPI_E_NO_SUPPORT, NULL);
        }
-
-       return r->out.result;
 }
 
 
@@ -746,12 +752,12 @@ static enum MAPISTATUS dcesrv_NspiGetSpecialTable(struct dcesrv_call_state *dce_
    \return MAPI_E_SUCCESS on success
 
  */
-static enum MAPISTATUS dcesrv_NspiGetTemplateInfo(struct dcesrv_call_state *dce_call,
-                                                 TALLOC_CTX *mem_ctx,
-                                                 struct NspiGetTemplateInfo *r)
+static void dcesrv_NspiGetTemplateInfo(struct dcesrv_call_state *dce_call,
+                                      TALLOC_CTX *mem_ctx,
+                                      struct NspiGetTemplateInfo *r)
 {
        DEBUG(3, ("exchange_nsp: NspiGetTemplateInfo (0xD) not implemented\n"));
-       DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
+       DCESRV_NSP_RETURN(r, DCERPC_FAULT_OP_RNG_ERROR, NULL);
 }
 
 
@@ -765,12 +771,12 @@ static enum MAPISTATUS dcesrv_NspiGetTemplateInfo(struct dcesrv_call_state *dce_
    \return MAPI_E_SUCCESS on success
 
  */
-static enum MAPISTATUS dcesrv_NspiModLinkAtt(struct dcesrv_call_state *dce_call,
-                                            TALLOC_CTX *mem_ctx,
-                                            struct NspiModLinkAtt *r)
+static void dcesrv_NspiModLinkAtt(struct dcesrv_call_state *dce_call,
+                                 TALLOC_CTX *mem_ctx,
+                                 struct NspiModLinkAtt *r)
 {
        DEBUG(3, ("exchange_nsp: NspiModLinkAtt (0xE) not implemented\n"));
-       DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
+       DCESRV_NSP_RETURN(r, DCERPC_FAULT_OP_RNG_ERROR, NULL);
 }
 
 
@@ -784,12 +790,12 @@ static enum MAPISTATUS dcesrv_NspiModLinkAtt(struct dcesrv_call_state *dce_call,
    \return MAPI_E_SUCCESS on success
 
  */
-static enum MAPISTATUS dcesrv_NspiDeleteEntries(struct dcesrv_call_state *dce_call,
-                                               TALLOC_CTX *mem_ctx,
-                                               struct NspiDeleteEntries *r)
+static void dcesrv_NspiDeleteEntries(struct dcesrv_call_state *dce_call,
+                                    TALLOC_CTX *mem_ctx,
+                                    struct NspiDeleteEntries *r)
 {
        DEBUG(3, ("exchange_nsp: NspiDeleteEntries (0xF) not implemented\n"));
-       DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
+       DCESRV_NSP_RETURN(r, DCERPC_FAULT_OP_RNG_ERROR, NULL);
 }
 
 
@@ -803,12 +809,12 @@ static enum MAPISTATUS dcesrv_NspiDeleteEntries(struct dcesrv_call_state *dce_ca
    \return MAPI_E_SUCCESS on success
 
  */
-static enum MAPISTATUS dcesrv_NspiQueryColumns(struct dcesrv_call_state *dce_call,
-                                              TALLOC_CTX *mem_ctx,
-                                              struct NspiQueryColumns *r)
+static void dcesrv_NspiQueryColumns(struct dcesrv_call_state *dce_call,
+                                   TALLOC_CTX *mem_ctx,
+                                   struct NspiQueryColumns *r)
 {
        DEBUG(3, ("exchange_nsp: NspiQueryColumns (0x10) not implemented\n"));
-       DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
+       DCESRV_NSP_RETURN(r, DCERPC_FAULT_OP_RNG_ERROR, NULL);
 }
 
 
@@ -822,12 +828,12 @@ static enum MAPISTATUS dcesrv_NspiQueryColumns(struct dcesrv_call_state *dce_cal
    \return MAPI_E_SUCCESS on success
 
  */
-static enum MAPISTATUS dcesrv_NspiGetNamesFromIDs(struct dcesrv_call_state *dce_call,
-                                                 TALLOC_CTX *mem_ctx,
-                                                 struct NspiGetNamesFromIDs *r)
+static void dcesrv_NspiGetNamesFromIDs(struct dcesrv_call_state *dce_call,
+                                      TALLOC_CTX *mem_ctx,
+                                      struct NspiGetNamesFromIDs *r)
 {
        DEBUG(3, ("exchange_nsp: NspiGetNamesFromIDs (0x11) not implemented\n"));
-       DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
+       DCESRV_NSP_RETURN(r, DCERPC_FAULT_OP_RNG_ERROR, NULL);
 }
 
 
@@ -841,12 +847,12 @@ static enum MAPISTATUS dcesrv_NspiGetNamesFromIDs(struct dcesrv_call_state *dce_
    \return MAPI_E_SUCCESS on success
 
  */
-static enum MAPISTATUS dcesrv_NspiGetIDsFromNames(struct dcesrv_call_state *dce_call,
-                                                 TALLOC_CTX *mem_ctx,
-                                                 struct NspiGetIDsFromNames *r)
+static void dcesrv_NspiGetIDsFromNames(struct dcesrv_call_state *dce_call,
+                                      TALLOC_CTX *mem_ctx,
+                                      struct NspiGetIDsFromNames *r)
 {
        DEBUG(3, ("exchange_nsp: NspiGetIDsFromNames (0x12) not implemented\n"));
-       DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
+       DCESRV_NSP_RETURN(r, DCERPC_FAULT_OP_RNG_ERROR, NULL);
 }
 
 
@@ -860,12 +866,15 @@ static enum MAPISTATUS dcesrv_NspiGetIDsFromNames(struct dcesrv_call_state *dce_
    \return MAPI_E_SUCCESS on success
 
  */
-static enum MAPISTATUS dcesrv_NspiResolveNames(struct dcesrv_call_state *dce_call,
-                                              TALLOC_CTX *mem_ctx,
-                                              struct NspiResolveNames *r)
+static void dcesrv_NspiResolveNames(struct dcesrv_call_state *dce_call,
+                                   TALLOC_CTX *mem_ctx,
+                                   struct NspiResolveNames *r)
 {
        DEBUG(3, ("exchange_nsp: NspiResolveNames (0x13) not implemented\n"));
-       DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
+       if (!NTLM_AUTH_IS_OK(dce_call)) {
+               DEBUG(1, ("No challenge requested by client, cannot authenticate\n"));
+       }
+       DCESRV_NSP_RETURN(r, DCERPC_FAULT_OP_RNG_ERROR, NULL);
 }
 
 
@@ -879,12 +888,11 @@ static enum MAPISTATUS dcesrv_NspiResolveNames(struct dcesrv_call_state *dce_cal
    \return MAPI_E_SUCCESS on success
 
  */
-static enum MAPISTATUS dcesrv_NspiResolveNamesW(struct dcesrv_call_state *dce_call,
-                                               TALLOC_CTX *mem_ctx,
-                                               struct NspiResolveNamesW *r)
+static void dcesrv_NspiResolveNamesW(struct dcesrv_call_state *dce_call,
+                                    TALLOC_CTX *mem_ctx,
+                                    struct NspiResolveNamesW *r)
 {
        enum MAPISTATUS                 retval = MAPI_E_SUCCESS;
-       struct exchange_nsp_session     *session;
        struct emsabp_context           *emsabp_ctx = NULL;
        struct ldb_message              *ldb_msg_ab;
        struct SPropTagArray            *pPropTags;
@@ -894,7 +902,6 @@ static enum MAPISTATUS dcesrv_NspiResolveNamesW(struct dcesrv_call_state *dce_ca
        struct WStringsArray_r          *paWStr;
        uint32_t                        i;
        int                             ret;
-       bool                            found = false;
        const char * const              recipient_attrs[] = { "*", NULL };
        const char * const              search_attr[] = { "mailNickName", "mail", "name", 
                                                          "displayName", "givenName", "sAMAccountName" };
@@ -904,25 +911,24 @@ static enum MAPISTATUS dcesrv_NspiResolveNamesW(struct dcesrv_call_state *dce_ca
        /* Step 0. Ensure incoming user is authenticated */
        if (!NTLM_AUTH_IS_OK(dce_call)) {
                DEBUG(1, ("No challenge requested by client, cannot authenticate\n"));
-               return MAPI_E_LOGON_FAILED;
+               DCESRV_NSP_RETURN(r, MAPI_E_LOGON_FAILED, NULL);
        }
 
-       for (session = nsp_session; !found && session; session = session->next) {
-               found = mpm_session_cmp(session->session, dce_call);
-               if (found == true) {
-                       emsabp_ctx = (struct emsabp_context *)session->session->private_data;
-                       found = true;
-               }
+       emsabp_ctx = dcesrv_find_emsabp_context(&r->in.handle->uuid);
+       if (!emsabp_ctx) {
+               DCESRV_NSP_RETURN(r, MAPI_E_CALL_FAILED, NULL);
        }
 
-       OPENCHANGE_RETVAL_IF(found == false, MAPI_E_LOGON_FAILED, NULL);
-
        /* Step 1. Prepare in/out data */
        retval = emsabp_ab_container_by_id(mem_ctx, emsabp_ctx, r->in.pStat->ContainerID, &ldb_msg_ab);
-       OPENCHANGE_RETVAL_IF(!MAPI_STATUS_IS_OK(retval), MAPI_E_INVALID_BOOKMARK, NULL);
+       if (!MAPI_STATUS_IS_OK(retval)) {
+               DCESRV_NSP_RETURN(r, MAPI_E_INVALID_BOOKMARK, NULL);
+       }
 
        purportedSearch = ldb_msg_find_attr_as_string(ldb_msg_ab, "purportedSearch", NULL);
-       OPENCHANGE_RETVAL_IF(!purportedSearch, MAPI_E_INVALID_BOOKMARK, NULL);
+       if (!purportedSearch) {
+               DCESRV_NSP_RETURN(r, MAPI_E_INVALID_BOOKMARK, NULL);
+       }
 
        /* Set default list of property tags if none were provided in input */
        if (!r->in.pPropTags) {
@@ -984,8 +990,7 @@ static enum MAPISTATUS dcesrv_NspiResolveNamesW(struct dcesrv_call_state *dce_ca
                *r->out.ppRows = pRows;
        }
 
-       r->out.result = retval;
-       return retval;
+       DCESRV_NSP_RETURN(r, retval, NULL);
 }
 
 
@@ -1005,7 +1010,6 @@ static NTSTATUS dcesrv_exchange_nsp_dispatch(struct dcesrv_call_state *dce_call,
                                             TALLOC_CTX *mem_ctx,
                                             void *r, struct mapiproxy *mapiproxy)
 {
-       enum MAPISTATUS                         retval;
        const struct ndr_interface_table        *table;
        uint16_t                                opnum;
 
@@ -1020,67 +1024,67 @@ static NTSTATUS dcesrv_exchange_nsp_dispatch(struct dcesrv_call_state *dce_call,
 
        switch (opnum) {
        case NDR_NSPIBIND:
-               retval = dcesrv_NspiBind(dce_call, mem_ctx, (struct NspiBind *)r);
+               dcesrv_NspiBind(dce_call, mem_ctx, (struct NspiBind *)r);
                break;
        case NDR_NSPIUNBIND:
-               retval = dcesrv_NspiUnbind(dce_call, mem_ctx, (struct NspiUnbind *)r);
+               dcesrv_NspiUnbind(dce_call, mem_ctx, (struct NspiUnbind *)r);
                break;
        case NDR_NSPIUPDATESTAT:
-               retval = dcesrv_NspiUpdateStat(dce_call, mem_ctx, (struct NspiUpdateStat *)r);
+               dcesrv_NspiUpdateStat(dce_call, mem_ctx, (struct NspiUpdateStat *)r);
                break;
        case NDR_NSPIQUERYROWS:
-               retval = dcesrv_NspiQueryRows(dce_call, mem_ctx, (struct NspiQueryRows *)r);
+               dcesrv_NspiQueryRows(dce_call, mem_ctx, (struct NspiQueryRows *)r);
                break;
        case NDR_NSPISEEKENTRIES:
-               retval = dcesrv_NspiSeekEntries(dce_call, mem_ctx, (struct NspiSeekEntries *)r);
+               dcesrv_NspiSeekEntries(dce_call, mem_ctx, (struct NspiSeekEntries *)r);
                break;
        case NDR_NSPIGETMATCHES:
-               retval = dcesrv_NspiGetMatches(dce_call, mem_ctx, (struct NspiGetMatches *)r);
+               dcesrv_NspiGetMatches(dce_call, mem_ctx, (struct NspiGetMatches *)r);
                break;
        case NDR_NSPIRESORTRESTRICTION:
-               retval = dcesrv_NspiResortRestriction(dce_call, mem_ctx, (struct NspiResortRestriction *)r);
+               dcesrv_NspiResortRestriction(dce_call, mem_ctx, (struct NspiResortRestriction *)r);
                break;
        case NDR_NSPIDNTOMID:
-               retval = dcesrv_NspiDNToMId(dce_call, mem_ctx, (struct NspiDNToMId *)r);
+               dcesrv_NspiDNToMId(dce_call, mem_ctx, (struct NspiDNToMId *)r);
                break;
        case NDR_NSPIGETPROPLIST:
-               retval = dcesrv_NspiGetPropList(dce_call, mem_ctx, (struct NspiGetPropList *)r);
+               dcesrv_NspiGetPropList(dce_call, mem_ctx, (struct NspiGetPropList *)r);
                break;
        case NDR_NSPIGETPROPS:
-               retval = dcesrv_NspiGetProps(dce_call, mem_ctx, (struct NspiGetProps *)r);
+               dcesrv_NspiGetProps(dce_call, mem_ctx, (struct NspiGetProps *)r);
                break;
        case NDR_NSPICOMPAREMIDS:
-               retval = dcesrv_NspiCompareMIds(dce_call, mem_ctx, (struct NspiCompareMIds *)r);
+               dcesrv_NspiCompareMIds(dce_call, mem_ctx, (struct NspiCompareMIds *)r);
                break;
        case NDR_NSPIMODPROPS:
-               retval = dcesrv_NspiModProps(dce_call, mem_ctx, (struct NspiModProps *)r);
+               dcesrv_NspiModProps(dce_call, mem_ctx, (struct NspiModProps *)r);
                break;
        case NDR_NSPIGETSPECIALTABLE:
-               retval = dcesrv_NspiGetSpecialTable(dce_call, mem_ctx, (struct NspiGetSpecialTable *)r);
+               dcesrv_NspiGetSpecialTable(dce_call, mem_ctx, (struct NspiGetSpecialTable *)r);
                break;
        case NDR_NSPIGETTEMPLATEINFO:
-               retval = dcesrv_NspiGetTemplateInfo(dce_call, mem_ctx, (struct NspiGetTemplateInfo *)r);
+               dcesrv_NspiGetTemplateInfo(dce_call, mem_ctx, (struct NspiGetTemplateInfo *)r);
                break;
        case NDR_NSPIMODLINKATT:
-               retval = dcesrv_NspiModLinkAtt(dce_call, mem_ctx, (struct NspiModLinkAtt *)r);
+               dcesrv_NspiModLinkAtt(dce_call, mem_ctx, (struct NspiModLinkAtt *)r);
                break;
        case NDR_NSPIDELETEENTRIES:
-               retval = dcesrv_NspiDeleteEntries(dce_call, mem_ctx, (struct NspiDeleteEntries *)r);
+               dcesrv_NspiDeleteEntries(dce_call, mem_ctx, (struct NspiDeleteEntries *)r);
                break;
        case NDR_NSPIQUERYCOLUMNS:
-               retval = dcesrv_NspiQueryColumns(dce_call, mem_ctx, (struct NspiQueryColumns *)r);
+               dcesrv_NspiQueryColumns(dce_call, mem_ctx, (struct NspiQueryColumns *)r);
                break;
        case NDR_NSPIGETNAMESFROMIDS:
-               retval = dcesrv_NspiGetNamesFromIDs(dce_call, mem_ctx, (struct NspiGetNamesFromIDs *)r);
+               dcesrv_NspiGetNamesFromIDs(dce_call, mem_ctx, (struct NspiGetNamesFromIDs *)r);
                break;
        case NDR_NSPIGETIDSFROMNAMES:
-               retval = dcesrv_NspiGetIDsFromNames(dce_call, mem_ctx, (struct NspiGetIDsFromNames *)r);
+               dcesrv_NspiGetIDsFromNames(dce_call, mem_ctx, (struct NspiGetIDsFromNames *)r);
                break;
        case NDR_NSPIRESOLVENAMES:
-               retval = dcesrv_NspiResolveNames(dce_call, mem_ctx, (struct NspiResolveNames *)r);
+               dcesrv_NspiResolveNames(dce_call, mem_ctx, (struct NspiResolveNames *)r);
                break;
        case NDR_NSPIRESOLVENAMESW:
-               retval = dcesrv_NspiResolveNamesW(dce_call, mem_ctx, (struct NspiResolveNamesW *)r);
+               dcesrv_NspiResolveNamesW(dce_call, mem_ctx, (struct NspiResolveNamesW *)r);
                break;
        }
 
@@ -1129,18 +1133,6 @@ static NTSTATUS dcesrv_exchange_nsp_unbind(struct server_id server_id, uint32_t
        bool                            found = false;
 
        DEBUG (0, ("dcesrv_exchange_nsp_unbind\n"));
-
-       for (session = nsp_session; !found && session; session = session->next) {
-               found = mpm_session_cmp_sub(session->session, server_id, context_id);
-               if (found == true) {
-                       mpm_session_release(session->session);
-                       DLIST_REMOVE(nsp_session, session);
-                       DEBUG(6, ("[%s:%d]: Session found and released\n", __FUNCTION__, __LINE__));
-                       return NT_STATUS_OK;
-               }
-       }
-
-       return NT_STATUS_OK;
 }
 
 
index 1d1f48f99c99b92536af7eda57a368e051c6f677..0288c31490311505585c8f47ae1d4db761dae7cc 100644 (file)
@@ -50,14 +50,13 @@ struct emsabp_context {
        TALLOC_CTX              *mem_ctx;
 };
 
-
 struct exchange_nsp_session {
        struct mpm_session              *session;
+       struct GUID                     uuid;
        struct exchange_nsp_session     *prev;
        struct exchange_nsp_session     *next;
 };
 
-
 struct emsabp_MId {
        uint32_t        MId;
        char            *dn;
@@ -106,6 +105,8 @@ struct EphemeralEntryID {
 #define        EMSABP_TDB_TMP_MID_START        0x5000
 #define        EMSABP_TDB_DATA_REC             "MId_index"
 
+#define DCESRV_NSP_RETURN(r,c,ctx) { r->out.result = c; return; if (ctx) talloc_free(ctx); }
+
 __BEGIN_DECLS
 
 NTSTATUS       samba_init_module(void);