[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

r10371 - /man-cgi/man.cgi



Author: jfs
Date: Sat Feb  8 16:51:19 2014
New Revision: 10371

URL: http://svn.debian.org/wsvn/?sc=1&rev=10371
Log:

Added code to control the exec() and timeout if it does not finish in time.

Under some calls, man does not seem to return cleanly. It happens when 
accessing http://manpages.debian.org/cgi-bin/man.cgi?query=apt_preferences&apropos=0&sektion=0&manpath=Debian+unstable+sid&format=html&locale=ja

Which spawns the following process group that never finishes:

www-data 12988  0.0  0.0  20272  1632 ?        S    16:44   0:00 /usr/bin/man -M /srv/manpages.debian.org/extractor/manpages-dists/sid/usr/share/man/ja -L ja_JP.eucJP --  apt_preferences
www-data 13000  0.0  0.0   4180   576 ?        S    16:44   0:00  \_ /bin/sh /usr/bin/nroff -mandoc -Tutf8
www-data 13004  0.0  0.0  11972  1176 ?        S    16:44   0:00  |   \_ groff -mtty-char -Tutf8 -mandoc
www-data 13005 15.8  0.0  14920  3516 ?        R    16:44   0:41  |       \_ troff -mtty-char -mandoc -Tutf8
www-data 13006  2.7  0.0  13256  1800 ?        S    16:44   0:07  |       \_ grotty
www-data 13001  0.0  0.0  14836  6136 ?        S    16:44   0:00  \_ iconv -c -f UTF-8 -t EUC-JP//TRANSLIT
www-data 13002  0.0  0.0   8848   640 ?        S    16:44   0:00  \_ col -b -p -x




Modified:
    man-cgi/man.cgi

Modified: man-cgi/man.cgi
URL: http://svn.debian.org/wsvn/man-cgi/man.cgi?rev=10371&op=diff
==============================================================================
--- man-cgi/man.cgi	(original)
+++ man-cgi/man.cgi	Sat Feb  8 16:51:19 2014
@@ -54,7 +54,7 @@
 #$command{'man'} =     'man'; # 8Bit clean man
 #$command{'man'} =     '/home/wosch/bin/cgi-man'; # 8Bit clean man
 $command{'man'} =     '/usr/bin/man'; # 8Bit clean man
-
+$exec_timeout   = 20; # seconds to wait for the man command to execute
 
 # Config Options
 # map sections to their man command argument(s)
@@ -820,8 +820,21 @@
 #    die "Program $prog is tainted\n" if is_tainted($prog);
 #    die "Arguments @args are tainted\n" if is_tainted(@args);
     if ($pid == 0) {
-	exec $prog, @args;
-	&mydie("exec $prog failed\n");
+	my $execpid = fork;
+	if ($execpid > 0){
+		eval{
+			local $SIG{ALRM} = sub {kill 9, -$PID; die "TIMEOUT!"};
+			alarm $exec_timeout;
+			waitpid($execpid, 0);
+			alarm 0;
+		};
+	}
+	elsif ($execpid == 0){
+		setpgrp(0,0);
+		exec $prog, @args;
+		&mydie("exec $prog failed\n");
+		exit(0);
+	}
     }
     1;
 }


Reply to: