aboutsummaryrefslogtreecommitdiff
path: root/IkiWiki/Plugin/edittemplate.pm
diff options
context:
space:
mode:
authorSimon McVittie <smcv@debian.org>2014-02-21 17:06:36 +0000
committerSimon McVittie <smcv@debian.org>2014-02-21 17:06:36 +0000
commitbb359796b80d2e8bd36f6c8eafe9510874184e32 (patch)
treefd25147af7e94441d0189810734a5f59617110ca /IkiWiki/Plugin/edittemplate.pm
parentbe3483fe9be559a62dd88577b3a374d55b7262f3 (diff)
downloadikiwiki-bb359796b80d2e8bd36f6c8eafe9510874184e32.tar
ikiwiki-bb359796b80d2e8bd36f6c8eafe9510874184e32.tar.gz
protect $@ whenever a block using $@ is non-trivial
As noted in the Try::Tiny man page, eval/$@ can be quite awkward in corner cases, because $@ has the same properties and problems as C's errno. While writing a regression test for definetemplate in which it couldn't find an appropriate template, I received <span class="error">Error: failed to process template <span class="createlink">deftmpl</span> </span> instead of the intended <span class="error">Error: failed to process template <span class="createlink">deftmpl</span> template deftmpl not found</span> which turned out to be because the "catch"-analogous block called gettext before it used $@, and gettext can call define_gettext, which uses eval. This commit alters all current "catch"-like blocks that use $@, except those that just do trivial things with $@ (string interpolation, string concatenation) and call a function (die, error, print, etc.)
Diffstat (limited to 'IkiWiki/Plugin/edittemplate.pm')
-rw-r--r--IkiWiki/Plugin/edittemplate.pm4
1 files changed, 3 insertions, 1 deletions
diff --git a/IkiWiki/Plugin/edittemplate.pm b/IkiWiki/Plugin/edittemplate.pm
index c7f1e4fa7..e3ce5e3d9 100644
--- a/IkiWiki/Plugin/edittemplate.pm
+++ b/IkiWiki/Plugin/edittemplate.pm
@@ -130,9 +130,11 @@ sub filltemplate ($$) {
$template=template("/".$template_page);
};
if ($@) {
+ # gettext can clobber $@
+ my $error = $@;
# Indicate that the earlier preprocessor directive set
# up a template that doesn't work.
- return "[[!edittemplate ".gettext("failed to process template:")." $@]]";
+ return "[[!edittemplate ".gettext("failed to process template:")." $error]]";
}
$template->param(name => $page);