]> 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 fd603bb821d4109d36787befc7760d739077ef22..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>
@@ -86,6 +85,10 @@ newPlugin(
        }
 
        rc = loadPlugin( pPlugin, path, initfunc, TRUE, NULL, &hdLoadHandle );
+       if ( rc != 0 ) {
+               rc = LDAP_OTHER;
+               goto done;
+       }
 
 done:
        if ( rc != LDAP_SUCCESS && pPlugin != NULL ) {
@@ -161,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
  *********************************************************************/
@@ -180,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 )  {
@@ -211,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 ) {
@@ -218,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 ) {
@@ -240,7 +283,7 @@ done:
 
        return rc;
 }
-              
+
 /*********************************************************************
  * Function Name:      createExtendedOp
  *
@@ -557,7 +600,9 @@ loadPlugin(
        return rc;
 }
 
-
+/*
+ * Special support for computed attribute plugins
+ */
 int 
 doPluginFNs(
        Backend         *be,    
@@ -568,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;
@@ -594,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( be, 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;
 }
 
@@ -650,8 +673,8 @@ netscape_plugin(
                iType = SLAPI_PLUGIN_POSTOPERATION;
        } else if ( strcasecmp( argv[1], "extendedop" ) == 0 ) {
                iType = SLAPI_PLUGIN_EXTENDEDOP;
-       } else if ( strcasecmp( argv[1], "opattrsp" ) == 0 ) {
-               iType = SLAPI_PLUGIN_OPATTR_SP;
+       } else if ( strcasecmp( argv[1], "object" ) == 0 ) {
+               iType = SLAPI_PLUGIN_OBJECT;
        } else {
                fprintf( stderr, "%s: line %d: invalid plugin type \"%s\".\n",
                                fname, lineno, argv[1] );
@@ -668,7 +691,7 @@ netscape_plugin(
        if ( iType == SLAPI_PLUGIN_PREOPERATION ||
                        iType == SLAPI_PLUGIN_EXTENDEDOP ||
                        iType == SLAPI_PLUGIN_POSTOPERATION ||
-                       iType == SLAPI_PLUGIN_OPATTR_SP ) {
+                       iType == SLAPI_PLUGIN_OBJECT ) {
                int rc;
                Slapi_PBlock *pPlugin;