From 6fc3b624f209f71335bed9947eda956e7d118458 Mon Sep 17 00:00:00 2001 From: joey Date: Fri, 25 Aug 2006 19:06:37 +0000 Subject: [PATCH] * Generalised preprocesser loop protection code. --- IkiWiki/Plugin/inline.pm | 6 ------ IkiWiki/Render.pm | 11 ++++++++++- debian/changelog | 3 ++- 3 files changed, 12 insertions(+), 8 deletions(-) diff --git a/IkiWiki/Plugin/inline.pm b/IkiWiki/Plugin/inline.pm index c712f7bb4..e7ec238ed 100644 --- a/IkiWiki/Plugin/inline.pm +++ b/IkiWiki/Plugin/inline.pm @@ -22,7 +22,6 @@ sub import { #{{{ package IkiWiki; my %toping; -my @processing_inline; sub yesno ($) { #{{{ my $val=shift; @@ -32,10 +31,6 @@ sub yesno ($) { #{{{ sub preprocess_inline (@) { #{{{ my %params=@_; - # Avoid nested inlines, to avoid loops etc. - return "" if grep { $_ eq $params{page} } @processing_inline; - push @processing_inline, $params{page}; - if (! exists $params{pages}) { return ""; } @@ -133,7 +128,6 @@ sub preprocess_inline (@) { #{{{ $toping{$params{page}}=1 unless $config{rebuild}; } - pop @processing_inline; return $ret; } #}}} diff --git a/IkiWiki/Render.pm b/IkiWiki/Render.pm index f38669728..8e998e8b2 100644 --- a/IkiWiki/Render.pm +++ b/IkiWiki/Render.pm @@ -84,6 +84,7 @@ sub parentlinks ($) { #{{{ return @ret; } #}}} +my @preprocessing; sub preprocess ($$$) { #{{{ my $page=shift; # the page the data comes from my $destpage=shift; # the page the data will appear in (different for inline) @@ -96,6 +97,11 @@ sub preprocess ($$$) { #{{{ if (length $escape) { return "[[$command $params]]"; } + elsif (grep { $_ eq $page } @preprocessing) { + # Avoid loops of preprocessed pages preprocessing + # other pages that preprocess them, etc. + return "[[$command would cause preprocessing loop]]"; + } elsif (exists $hooks{preprocess}{$command}) { # Note: preserve order of params, some plugins may # consider it significant. @@ -123,11 +129,14 @@ sub preprocess ($$$) { #{{{ push @params, $val, ''; } } - return $hooks{preprocess}{$command}{call}->( + push @preprocessing, $page; + my $ret=$hooks{preprocess}{$command}{call}->( @params, page => $page, destpage => $destpage, ); + pop @preprocessing; + return $ret; } else { return "[[$command not processed]]"; diff --git a/debian/changelog b/debian/changelog index 0672428b1..875d4f9a9 100644 --- a/debian/changelog +++ b/debian/changelog @@ -30,8 +30,9 @@ ikiwiki (1.22) UNRELEASED; urgency=low * Use DESTDIR and not PREFIX to specify installation prefix for packaging. * Support running "perl Makefile.PL PREFIX=foo" to build ikiwiki to run from a different directory. + * Generalised preprocesser loop protection code. - -- Joey Hess Thu, 24 Aug 2006 21:28:45 -0400 + -- Joey Hess Fri, 25 Aug 2006 14:48:36 -0400 ikiwiki (1.21) unstable; urgency=low -- 2.26.2