]> git.sur5r.net Git - openldap/blobdiff - servers/slapd/slapi/plugin.c
Do not return pointers into BerElement we do not own
[openldap] / servers / slapd / slapi / plugin.c
index 46f3979ce34ebfa8b4614efc653aee07639a304c..9b978d9c4e35f49b3690ff2d34bfa5c045ed93fe 100644 (file)
@@ -11,7 +11,6 @@
  */
 
 #include "portable.h"
-#include "slapi_common.h"
 #include <ldap_pvt_thread.h>
 #include <slap.h>
 #include <slapi.h>
@@ -165,7 +164,8 @@ insertPlugin(
  * Output:             none
  *
  * Return Values:      this routine returns a pointer to an array of function
- *                     pointers
+ *                     pointers containing backend-specific plugin functions
+ *                     followed by global plugin functions
  *
  * Messages:           None
  *********************************************************************/
@@ -184,17 +184,35 @@ getAllPluginFuncs(
 
        assert( ppFuncPtrs );
 
-       pCurrentPB = ( be == NULL ) ? pGPlugins : (Slapi_PBlock *)(be->be_pb);
-     
-       if ( pCurrentPB == NULL ) { 
-               /*
-                * LDAP_OTHER is returned if no plugins are installed
-                */
-               rc = LDAP_OTHER;
+       /*
+        * First, count the plugins associated with a specific
+        * backend.
+        */
+       if ( be != NULL ) {
+               pCurrentPB = (Slapi_PBlock *)be->be_pb;
+
+               while ( pCurrentPB != NULL && rc == LDAP_SUCCESS ) {
+                       rc = slapi_pblock_get( pCurrentPB, functype, &FuncPtr );
+                       if ( rc == LDAP_SUCCESS ) {
+                               if ( FuncPtr != NULL )  {
+                                       numPB++;
+                               }
+                               rc = slapi_pblock_get( pCurrentPB,
+                                               SLAPI_IBM_PBLOCK, &pCurrentPB );
+                       }
+               }
+       }
+
+       if ( rc != LDAP_SUCCESS ) {
                goto done;
        }
 
-       while ( pCurrentPB != NULL && rc == LDAP_SUCCESS ) {
+       /*
+        * Then, count the global plugins.
+        */
+       pCurrentPB = pGPlugins;
+
+       while  ( pCurrentPB != NULL && rc == LDAP_SUCCESS ) {
                rc = slapi_pblock_get( pCurrentPB, functype, &FuncPtr );
                if ( rc == LDAP_SUCCESS ) {
                        if ( FuncPtr != NULL )  {
@@ -215,6 +233,10 @@ getAllPluginFuncs(
                goto done;
        }
 
+       /*
+        * Now, build the function pointer array of backend-specific
+        * plugins followed by global plugins.
+        */
        *ppFuncPtrs = pTmpFuncPtr = 
                (SLAPI_FUNC *)ch_malloc( ( numPB + 1 ) * sizeof(SLAPI_FUNC) ); 
        if ( ppFuncPtrs == NULL ) {
@@ -222,7 +244,24 @@ getAllPluginFuncs(
                goto done;
        }
 
-       pCurrentPB = ( be == NULL ) ? pGPlugins : (Slapi_PBlock *)(be->be_pb);
+       if ( be != NULL ) {
+               pCurrentPB = (Slapi_PBlock *)be->be_pb;
+
+               while ( pCurrentPB != NULL && rc == LDAP_SUCCESS )  {
+                       rc = slapi_pblock_get( pCurrentPB, functype, &FuncPtr );
+                       if ( rc == LDAP_SUCCESS ) {
+                               if ( FuncPtr != NULL )  {
+                                       *pTmpFuncPtr = FuncPtr;
+                                       pTmpFuncPtr++;
+                               } 
+                               rc = slapi_pblock_get( pCurrentPB,
+                                               SLAPI_IBM_PBLOCK, &pCurrentPB );
+                       }
+               }
+       }
+
+       pCurrentPB = pGPlugins;
+
        while ( pCurrentPB != NULL && rc == LDAP_SUCCESS )  {
                rc = slapi_pblock_get( pCurrentPB, functype, &FuncPtr );
                if ( rc == LDAP_SUCCESS ) {
@@ -244,7 +283,7 @@ done:
 
        return rc;
 }
-              
+
 /*********************************************************************
  * Function Name:      createExtendedOp
  *
@@ -574,7 +613,11 @@ doPluginFNs(
        int rc = 0;
        SLAPI_FUNC *pGetPlugin = NULL, *tmpPlugin = NULL; 
 
-       rc = getAllPluginFuncs(be, funcType, &tmpPlugin );
+       if ( pPB == NULL ) {
+               return 0;
+       }
+
+       rc = getAllPluginFuncs( be, funcType, &tmpPlugin );
        if ( rc != LDAP_SUCCESS || tmpPlugin == NULL ) {
                /* Nothing to do, front-end should ignore. */
                return 0;
@@ -600,32 +643,6 @@ doPluginFNs(
 
        slapi_ch_free( (void **)&tmpPlugin );
 
-       /*
-        * If we failed, and this wasn't a postoperation plugin, we
-        * should return the failure to the frontend.
-        */
-       if ( !SLAPI_PLUGIN_IS_POST_FN( funcType ) && rc != 0 ) {
-               return rc;
-       }
-
-       /*
-        * Try any global plugins (not associated with a specific
-        * backend); same logic as above.
-        */
-       if ( be != NULL ) {
-               rc = getAllPluginFuncs( NULL, funcType, &tmpPlugin );
-               if ( rc != LDAP_SUCCESS || tmpPlugin == NULL )
-                       return 0;
-               for ( pGetPlugin = tmpPlugin; *pGetPlugin != NULL; pGetPlugin++ ) {
-                       rc = (*pGetPlugin)(pPB);
-                       if ( !SLAPI_PLUGIN_IS_POST_FN( funcType ) && rc != 0 ) {
-                               break;
-                       }
-               }
-       }
-
-       slapi_ch_free( (void **)&tmpPlugin );
-
        return rc;
 }