]> git.sur5r.net Git - openldap/commitdiff
Additional changes from devel
authorKurt Zeilenga <kurt@openldap.org>
Sat, 17 Jun 2000 20:07:51 +0000 (20:07 +0000)
committerKurt Zeilenga <kurt@openldap.org>
Sat, 17 Jun 2000 20:07:51 +0000 (20:07 +0000)
build/openldap.m4
include/portable.h.in
libraries/libldap_r/thr_posix.c
servers/slapd/acl.c

index 1ce490ff12a9098205349429ccba2387d4fe942c..a12b0a2577d9dff5a6aa7e0435c95afbf2ebab2c 100644 (file)
@@ -731,7 +731,7 @@ dnl defines ol_cv_sys_linux_threads to 'yes' or 'no'
 dnl    'no' implies pthreads implementation is not LinuxThreads.
 dnl 
 AC_DEFUN([OL_SYS_LINUX_THREADS], [
-       AC_CHECK_FUNC(pthread_kill_other_threads_np)
+       AC_CHECK_FUNCS(pthread_kill_other_threads_np)
        AC_CACHE_CHECK([for LinuxThreads implementation],
                [ol_cv_sys_linux_threads],
                [ol_cv_sys_linux_threads=$ac_cv_func_pthread_kill_other_threads_np])
index 55786a172a227b6aeaab5591fad0c893fc3c839e..ff2fe67015177dff1ca57f73d3cfa9ed6b92d2d7 100644 (file)
 /* Define if you have the pthread_kill function.  */
 #undef HAVE_PTHREAD_KILL
 
+/* Define if you have the pthread_kill_other_threads_np function.  */
+#undef HAVE_PTHREAD_KILL_OTHER_THREADS_NP
+
 /* Define if you have the pthread_rwlock_destroy function.  */
 #undef HAVE_PTHREAD_RWLOCK_DESTROY
 
index 95d30f1b4b4d186471073954d73ee010ae9c2a90..3d0bba9f93132e207d6518789c524a190f1a6cda 100644 (file)
@@ -41,6 +41,10 @@ ldap_int_thread_initialize( void )
 int
 ldap_int_thread_destroy( void )
 {
+#ifdef HAVE_PTHREAD_KILL_OTHER_THREADS_NP
+       /* LinuxThreads: kill clones */
+       pthread_kill_other_threads_np();
+#endif
        return 0;
 }
 
index cc5882a58a18e745e162deb5b037722c93d006da..c94273782149999d628a3fd7b8911842bbbaf330 100644 (file)
@@ -532,7 +532,7 @@ acl_mask(
                if ( b->a_dn_at != NULL && op->o_ndn != NULL ) {
                        Attribute       *at;
                        struct berval   bv;
-                       int match = 0;
+                       int rc, match = 0;
                        const char *text;
                        const char *desc = b->a_dn_at->ad_cname->bv_val;
 
@@ -555,21 +555,41 @@ acl_mask(
                        }
 
                        if( match ) {
-                               if ( b->a_dn_self && (val == NULL
-                                       || value_match( &match, b->a_dn_at,
-                                               b->a_dn_at->ad_type->sat_equality, val, &bv, &text ) )
-                                               != LDAP_SUCCESS
-                                       || match )
-                               {
-                                       continue;
+                               /* have a dnattr match. if this is a self clause then
+                                * the target must also match the op dn.
+                                */
+                               if ( b->a_dn_self ) {
+                                       /* check if the target is an attribute. */
+                                       if ( val == NULL )
+                                               continue;
+                                       /* target is attribute, check if the attribute value
+                                        * is the op dn.
+                                        */
+                                       rc = value_match(       &match, b->a_dn_at,
+                                                                               b->a_dn_at->ad_type->sat_equality,
+                                                                               val, &bv, &text );
+                                       /* on match error or no match, fail the ACL clause */
+                                       if (rc != LDAP_SUCCESS || match != 0 )
+                                               continue;
                                }
-                       } else if ( ! b->a_dn_self || val == NULL
-                               || value_match( &match, b->a_dn_at,
-                                       b->a_dn_at->ad_type->sat_equality, val, &bv, &text )
-                                       != LDAP_SUCCESS
-                               || match )
-                       {
-                               continue;
+                       } else {
+                               /* no dnattr match, check if this is a self clause */
+                               if ( ! b->a_dn_self )
+                                       continue;
+                               /* this is a self clause, check if the target is an
+                                * attribute.
+                                */
+                               if ( val == NULL )
+                                       continue;
+                               /* target is attribute, check if the attribute value
+                                * is the op dn.
+                                */
+                               rc = value_match(       &match, b->a_dn_at,
+                                                                       b->a_dn_at->ad_type->sat_equality,
+                                                                       val, &bv, &text );
+                               /* on match error or no match, fail the ACL clause */
+                               if (rc != LDAP_SUCCESS || match != 0 )
+                                       continue;
                        }
                }