diff options
author | joey <joey@0fa5a96a-9a0e-0410-b3b2-a0fd24251071> | 2006-09-25 21:38:25 +0000 |
---|---|---|
committer | joey <joey@0fa5a96a-9a0e-0410-b3b2-a0fd24251071> | 2006-09-25 21:38:25 +0000 |
commit | 9f45c3080e893174751b9a4b7fe3e59da611a2ec (patch) | |
tree | f189927374d2c4991f0226ddf70b5a32a82ed5a5 /IkiWiki/Plugin/linkmap.pm | |
parent | 48e004acb1cd8d09dfa52377bd48edaee293bc9f (diff) | |
download | ikiwiki-9f45c3080e893174751b9a4b7fe3e59da611a2ec.tar ikiwiki-9f45c3080e893174751b9a4b7fe3e59da611a2ec.tar.gz |
* Fix a forkbomb in various calls to IPC::Open2, which has a highly
braindead interface. Closes: #389383
Diffstat (limited to 'IkiWiki/Plugin/linkmap.pm')
-rw-r--r-- | IkiWiki/Plugin/linkmap.pm | 29 |
1 files changed, 14 insertions, 15 deletions
diff --git a/IkiWiki/Plugin/linkmap.pm b/IkiWiki/Plugin/linkmap.pm index 6b1609744..497b1ef43 100644 --- a/IkiWiki/Plugin/linkmap.pm +++ b/IkiWiki/Plugin/linkmap.pm @@ -63,18 +63,11 @@ sub genmap ($) { #{{{ # TODO: should really add the png to renderedfiles and call # check_overwrite, but currently renderedfiles # only supports listing one file per page. - my $tries=10; my $pid; - while (1) { - eval { - $pid=open2(*IN, *OUT, "dot -Tpng -o '$config{destdir}/$params{page}.png' -Tcmapx"); - }; - last unless $@; - $tries--; - if ($tries < 1) { - return "failed to run dot: $@"; - } - } + my $sigpipe=0;; + $SIG{PIPE}=sub { $sigpipe=1 }; + $pid=open2(*IN, *OUT, "dot -Tpng -o '$config{destdir}/$params{page}.png' -Tcmapx"); + # open2 doesn't respect "use open ':utf8'" binmode (IN, ':utf8'); binmode (OUT, ':utf8'); @@ -96,12 +89,18 @@ sub genmap ($) { #{{{ local $/=undef; my $ret="<object data=\"". - IkiWiki::abs2rel("$params{page}.png", IkiWiki::dirname($params{page})). - "\" type=\"image/png\" usemap=\"#linkmap$mapnum\">\n". - <IN>. - "</object>"; + IkiWiki::abs2rel("$params{page}.png", IkiWiki::dirname($params{page})). + "\" type=\"image/png\" usemap=\"#linkmap$mapnum\">\n". + <IN>. + "</object>"; close IN; + waitpid $pid, 0; + $SIG{PIPE}="DEFAULT"; + if ($sigpipe) { + return "[[linkmap failed to run dot]]"; + } + return $ret; } #}}} |