|
|
|
@ -4,7 +4,6 @@ import (
|
|
|
|
|
"os/exec"
|
|
|
|
|
"strings"
|
|
|
|
|
"syscall"
|
|
|
|
|
"time"
|
|
|
|
|
|
|
|
|
|
"github.com/grufwub/go-errors"
|
|
|
|
|
)
|
|
|
|
@ -94,9 +93,6 @@ func ExecuteCGIScript(client *Client, request *Request, pathInfo string) *errors
|
|
|
|
|
// Create cmd object
|
|
|
|
|
cmd := exec.Command(request.Path().Absolute())
|
|
|
|
|
|
|
|
|
|
// Set new process group id
|
|
|
|
|
cmd.SysProcAttr = &syscall.SysProcAttr{Setpgid: true}
|
|
|
|
|
|
|
|
|
|
// Setup cmd environment
|
|
|
|
|
cmd.Env = generateCGIEnv(client, request, pathInfo)
|
|
|
|
|
cmd.Dir = request.Path().Root()
|
|
|
|
@ -113,28 +109,9 @@ func ExecuteCGIScript(client *Client, request *Request, pathInfo string) *errors
|
|
|
|
|
return errors.WrapError(CGIStartErr, err)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Setup goroutine to kill cmd after maxCGIRunTime
|
|
|
|
|
go func() {
|
|
|
|
|
// At least let the script try to finish...
|
|
|
|
|
time.Sleep(maxCGIRunTime)
|
|
|
|
|
|
|
|
|
|
// We've already finished
|
|
|
|
|
if cmd.ProcessState != nil {
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Get process group id.
|
|
|
|
|
pgid, err := syscall.Getpgid(cmd.Process.Pid)
|
|
|
|
|
if err != nil {
|
|
|
|
|
SystemLog.Fatalf(pgidNotFoundErrStr)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Kill process group!
|
|
|
|
|
err = syscall.Kill(-pgid, syscall.SIGTERM)
|
|
|
|
|
if err != nil {
|
|
|
|
|
SystemLog.Fatalf(pgidStopErrStr, pgid, err.Error())
|
|
|
|
|
}
|
|
|
|
|
}()
|
|
|
|
|
// NOTE: we don't set a max CGI script run time anymore,
|
|
|
|
|
// we let the connection write deadline catch any longrunning
|
|
|
|
|
// scripts not sending content.
|
|
|
|
|
|
|
|
|
|
// Wait for command to finish
|
|
|
|
|
err = cmd.Wait()
|
|
|
|
|