Project

General

Profile

Actions

Bug #2158

closed

src/mod_cgi.c leaks opened file descriptors when fork fails

Added by rata over 11 years ago. Updated over 11 years ago.

Status:
Fixed
Priority:
Normal
Category:
mod_cgi
Target version:
-
ASK QUESTIONS IN Forums:

Description

In file src/mod_cgi.c the function cgi_create_env calls two times pipe() and creates two fds on each call. Then if fork returns -1, the opened fds are leaked since the function just returns -1 (and the arrays used to call pipe() are in the stack, so there is no other reference to them). That results in 4 fds leaked each time fork fails.

I noticed this when my server was under memory pressure and fork started to fail. Then all fds where used and the " file not found ... or so: Too many open files" error was shown in the logs. I was using the default 1024 server.max-fds setting, and if I "ls -1 /proc/<lighttpd pid>/fd | wc -l" it returned 1023. So it makes sense.

Also, when I run "lsof | grep lighttpd" I noticed there where a lot of fds of type FIFO named pipe. In fact, they where 1016 of them. And the error that fork fail appeared 254 times in the logs ==> 254*4 = 1016. So this 4 leaked fds per time fork fails would explain the 1016 opened fds I had.

The attached patch (against rev 2705 and only compile tested) should fix it by just closing the 4 opened fds before the function returns if fork failed.

This bug also affect at least 1.4.19 ubuntu version and debian 1.4.25 version. If you want me to backport the patch, please let me know.

Thanks a lot,
Rodrigo


Files

Actions #1

Updated by stbuehler over 11 years ago

  • Status changed from New to Fixed
  • % Done changed from 0 to 100

Applied in changeset r2706.

Actions

Also available in: Atom