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; +}