X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=libraries%2Flibrewrite%2Fcontext.c;h=2a851cee6844efeaa45eeca30709e536208e8954;hb=9df3bd087a2dc53bcd4c887c648dd5e01a9808e3;hp=e77b485165661996d737b079a6cbcef7bed74753;hpb=f4e007515431372cac83800054ec74a14d51d668;p=openldap diff --git a/libraries/librewrite/context.c b/libraries/librewrite/context.c index e77b485165..2a851cee68 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-2013 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 @@ -220,13 +215,13 @@ rewrite_context_apply( assert( result != NULL ); op->lo_depth++; - 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 ); + assert( op->lo_depth > 0 ); - s = strdup( string ); + s = (char *)string; for ( rule = context->lc_rule->lr_next; rule != NULL && op->lo_num_passes < info->li_max_passes; @@ -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 */ @@ -420,7 +433,7 @@ rewrite_context_free( { struct rewrite_context *context = (struct rewrite_context *)tmp; - assert( tmp ); + assert( tmp != NULL ); rewrite_context_destroy( &context ); } @@ -433,12 +446,12 @@ rewrite_context_destroy( struct rewrite_context *context; struct rewrite_rule *r; - assert( pcontext ); - assert( *pcontext ); + assert( pcontext != NULL ); + assert( *pcontext != NULL ); context = *pcontext; - assert( context->lc_rule ); + assert( context->lc_rule != NULL ); for ( r = context->lc_rule->lr_next; r; ) { struct rewrite_rule *cr = r; @@ -450,7 +463,7 @@ rewrite_context_destroy( free( context->lc_rule ); context->lc_rule = NULL; - assert( context->lc_name ); + assert( context->lc_name != NULL ); free( context->lc_name ); context->lc_name = NULL;