X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=libraries%2Flibrewrite%2Fcontext.c;h=8bf45c60b1abc13d1567b076248a39732455d879;hb=ae471f78c32d7531c729aa88116b8b413cc200bf;hp=e32eb8a11d147390b925a3a482d8491583cc6e45;hpb=1aa97d5f87981a4f113f28d0852f2ab130c4e2f7;p=openldap
diff --git a/libraries/librewrite/context.c b/libraries/librewrite/context.c
index e32eb8a11d..8bf45c60b1 100644
--- a/libraries/librewrite/context.c
+++ b/libraries/librewrite/context.c
@@ -1,26 +1,21 @@
-/******************************************************************************
+/* $OpenLDAP$ */
+/* This work is part of OpenLDAP Software .
*
- * Copyright (C) 2000 Pierangelo Masarati,
+ * Copyright 2000-2008 The OpenLDAP Foundation.
* All rights reserved.
*
- * Permission is granted to anyone to use this software for any purpose
- * on any computer system, and to alter it and redistribute it, subject
- * to the following restrictions:
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted only as authorized by the OpenLDAP
+ * Public License.
*
- * 1. The author is not responsible for the consequences of use of this
- * software, no matter how awful, even if they arise from flaws in it.
- *
- * 2. The origin of this software must not be misrepresented, either by
- * explicit claim or by omission. Since few users ever read sources,
- * credits should appear in the documentation.
- *
- * 3. Altered versions must be plainly marked as such, and must not be
- * misrepresented as being the original software. Since few users
- * ever read sources, credits should appear in the documentation.
- *
- * 4. This notice may not be removed or altered.
- *
- ******************************************************************************/
+ * A copy of this license is available in the file LICENSE in the
+ * top-level directory of the distribution or, alternatively, at
+ * .
+ */
+/* ACKNOWLEDGEMENT:
+ * This work was initially developed by Pierangelo Masarati for
+ * inclusion in OpenLDAP Software.
+ */
#include
@@ -36,10 +31,10 @@ rewrite_context_cmp(
const void *c2
)
{
- struct rewrite_context *lc1, *lc2;
+ const struct rewrite_context *lc1, *lc2;
- lc1 = (struct rewrite_context *)c1;
- lc2 = (struct rewrite_context *)c2;
+ lc1 = (const struct rewrite_context *)c1;
+ lc2 = (const struct rewrite_context *)c2;
assert( c1 != NULL );
assert( c2 != NULL );
@@ -144,6 +139,7 @@ rewrite_context_create(
free( context );
return NULL;
}
+ memset( context->lc_rule, 0, sizeof( struct rewrite_rule ) );
/*
* Add context to tree
@@ -222,10 +218,10 @@ rewrite_context_apply(
assert( op->lo_depth > 0 );
Debug( LDAP_DEBUG_TRACE, "==> rewrite_context_apply"
- " [depth=%d] string='%s'\n%s",
- op->lo_depth, string, "" );
+ " [depth=%d] string='%s'\n",
+ op->lo_depth, string, 0 );
- s = strdup( string );
+ s = (char *)string;
for ( rule = context->lc_rule->lr_next;
rule != NULL && op->lo_num_passes < info->li_max_passes;
@@ -250,7 +246,7 @@ rewrite_context_apply(
case REWRITE_REGEXEC_ERR:
Debug( LDAP_DEBUG_ANY, "==> rewrite_context_apply"
- " error ...\n%s%s%s", "", "", "");
+ " error ...\n", 0, 0, 0);
/*
* Checks for special actions to be taken
@@ -272,8 +268,7 @@ rewrite_context_apply(
case REWRITE_ACTION_IGNORE_ERR:
Debug( LDAP_DEBUG_ANY,
"==> rewrite_context_apply"
- " ignoring error ...\n%s%s%s",
- "", "", "" );
+ " ignoring error ...\n", 0, 0, 0 );
do_continue = 1;
break;
@@ -326,7 +321,9 @@ rewrite_context_apply(
if ( res != NULL ) {
struct rewrite_action *action;
- free( s );
+ if ( s != string && s != res ) {
+ free( s );
+ }
s = res;
for ( action = rule->lr_action;
@@ -362,6 +359,15 @@ rewrite_context_apply(
goto rc_end_of_context;
}
break;
+
+ /*
+ * This ends the rewrite context
+ * and returns a user-defined
+ * error code
+ */
+ case REWRITE_ACTION_USER:
+ return_code = ((int *)action->la_args)[ 0 ];
+ goto rc_end_of_context;
default:
/* ... */
@@ -390,10 +396,17 @@ rewrite_context_apply(
* This will instruct the server to return
* an `unwilling to perform' error message
*/
- case REWRITE_REGEXEC_UNWILLING:
+ case REWRITE_REGEXEC_UNWILLING:
return_code = REWRITE_REGEXEC_UNWILLING;
goto rc_end_of_context;
+ /*
+ * A user-defined error code has propagated ...
+ */
+ default:
+ assert( rc >= REWRITE_REGEXEC_USER );
+ goto rc_end_of_context;
+
}
rc_continue:; /* sent here by actions that require to continue */
@@ -413,3 +426,49 @@ rc_end_of_context:;
return return_code;
}
+void
+rewrite_context_free(
+ void *tmp
+)
+{
+ struct rewrite_context *context = (struct rewrite_context *)tmp;
+
+ assert( tmp != NULL );
+
+ rewrite_context_destroy( &context );
+}
+
+int
+rewrite_context_destroy(
+ struct rewrite_context **pcontext
+)
+{
+ struct rewrite_context *context;
+ struct rewrite_rule *r;
+
+ assert( pcontext != NULL );
+ assert( *pcontext != NULL );
+
+ context = *pcontext;
+
+ assert( context->lc_rule != NULL );
+
+ for ( r = context->lc_rule->lr_next; r; ) {
+ struct rewrite_rule *cr = r;
+
+ r = r->lr_next;
+ rewrite_rule_destroy( &cr );
+ }
+
+ free( context->lc_rule );
+ context->lc_rule = NULL;
+
+ assert( context->lc_name != NULL );
+ free( context->lc_name );
+ context->lc_name = NULL;
+
+ free( context );
+ *pcontext = NULL;
+
+ return 0;
+}