Skip to content

Commit 1238e85

Browse files
committed
Avoid server crash (nil dereference) if the fcgi application answers to stdout/stderr too early.
1 parent a6c592e commit 1238e85

File tree

1 file changed

+6
-5
lines changed

1 file changed

+6
-5
lines changed

gofcgisrv.go

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -125,7 +125,7 @@ func (s *FCGIRequester) GetValues() error {
125125
// env should be a slice of name=value pairs. It blocks until the application has finished.
126126
func (s *FCGIRequester) Request(env []string, stdin io.Reader, stdout io.Writer, stderr io.Writer) error {
127127
// Get a request. We may have to wait for one to free up.
128-
r, err := s.newRequest()
128+
r, err := s.newRequest(stdout, stderr)
129129
if err != nil {
130130
return err
131131
}
@@ -143,8 +143,6 @@ func (s *FCGIRequester) Request(env []string, stdin io.Reader, stdout io.Writer,
143143
}
144144
params.Close()
145145

146-
r.Stdout = stdout
147-
r.Stderr = stderr
148146
// Send stdin.
149147
reqStdin := newStreamWriter(r.conn.netconn, fcgiStdin, r.id)
150148
io.Copy(reqStdin, stdin)
@@ -174,7 +172,7 @@ func (s *FCGIRequester) numRequests() int {
174172
return n
175173
}
176174

177-
func (s *FCGIRequester) newRequest() (*request, error) {
175+
func (s *FCGIRequester) newRequest(stdout io.Writer, stderr io.Writer) (*request, error) {
178176
// We may have to wait for one to become available
179177
s.reqLock.Lock()
180178
defer s.reqLock.Unlock()
@@ -187,8 +185,11 @@ func (s *FCGIRequester) newRequest() (*request, error) {
187185
return nil, err
188186
}
189187
conn := newConn(s, netconn)
188+
r := conn.newRequest()
189+
r.Stdout = stdout
190+
r.Stderr = stderr
190191
go conn.Run()
191-
return conn.newRequest(), nil
192+
return r, nil
192193
}
193194

194195
func (s *FCGIRequester) releaseRequest(r *request) {

0 commit comments

Comments
 (0)