]> git.sur5r.net Git - openldap/blobdiff - libraries/librewrite/session.c
don't trust strchr/strrchr with bervals
[openldap] / libraries / librewrite / session.c
index bd0685167c926dab95868cd30e893df163a7e7d3..4fa58f876c5664e0f04af10563b938e7d30f8963 100644 (file)
@@ -302,6 +302,32 @@ rewrite_session_var_get(
        return REWRITE_SUCCESS;
 }
 
+static void
+rewrite_session_clean( void *v_session )
+{
+       struct rewrite_session  *session = (struct rewrite_session *)v_session;
+
+#ifdef USE_REWRITE_LDAP_PVT_THREADS
+       ldap_pvt_thread_rdwr_wlock( &session->ls_vars_mutex );
+#endif /* USE_REWRITE_LDAP_PVT_THREADS */
+
+       rewrite_var_delete( session->ls_vars );
+
+#ifdef USE_REWRITE_LDAP_PVT_THREADS
+       ldap_pvt_thread_rdwr_wunlock( &session->ls_vars_mutex );
+       ldap_pvt_thread_rdwr_destroy( &session->ls_vars_mutex );
+       ldap_pvt_thread_mutex_unlock( &session->ls_mutex );
+       ldap_pvt_thread_mutex_destroy( &session->ls_mutex );
+#endif /* USE_REWRITE_LDAP_PVT_THREADS */
+}
+
+static void
+rewrite_session_free( void *v_session )
+{
+       rewrite_session_clean( v_session );
+       free( v_session );
+}
+
 /*
  * Deletes a session
  */
@@ -311,13 +337,11 @@ rewrite_session_delete(
                const void *cookie
 )
 {
-       struct rewrite_session *session, tmp;
+       struct rewrite_session *session, tmp = { 0 };
 
        assert( info != NULL );
        assert( cookie != NULL );
 
-       tmp.ls_cookie = ( void * )cookie;
-       
        session = rewrite_session_find( info, cookie );
 
        if ( session == NULL ) {
@@ -329,18 +353,7 @@ rewrite_session_delete(
                return REWRITE_SUCCESS;
        }
 
-#ifdef USE_REWRITE_LDAP_PVT_THREADS
-       ldap_pvt_thread_rdwr_wlock( &session->ls_vars_mutex );
-#endif /* USE_REWRITE_LDAP_PVT_THREADS */
-
-       rewrite_var_delete( session->ls_vars );
-
-#ifdef USE_REWRITE_LDAP_PVT_THREADS
-       ldap_pvt_thread_rdwr_wunlock( &session->ls_vars_mutex );
-       ldap_pvt_thread_rdwr_destroy( &session->ls_vars_mutex );
-       ldap_pvt_thread_mutex_unlock( &session->ls_mutex );
-       ldap_pvt_thread_mutex_destroy( &session->ls_mutex );
-#endif /* USE_REWRITE_LDAP_PVT_THREADS */
+       rewrite_session_clean( session );
 
 #ifdef USE_REWRITE_LDAP_PVT_THREADS
        ldap_pvt_thread_rdwr_wlock( &info->li_cookies_mutex );
@@ -352,7 +365,9 @@ rewrite_session_delete(
        /*
         * There is nothing to delete in the return value
         */
+       tmp.ls_cookie = ( void * )cookie;
        avl_delete( &info->li_cookies, ( caddr_t )&tmp, rewrite_cookie_cmp );
+
        free( session );
 
 #ifdef USE_REWRITE_LDAP_PVT_THREADS
@@ -382,7 +397,7 @@ rewrite_session_destroy(
         * Should call per-session destruction routine ...
         */
        
-       count = avl_free( info->li_cookies, NULL );
+       count = avl_free( info->li_cookies, rewrite_session_free );
        info->li_cookies = NULL;
 
 #if 0