projects
/
metaproxy-moved-to-github.git
/ commitdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
| commitdiff |
tree
raw
|
patch
|
inline
| side by side (from parent 1:
b078c89
)
CGI filter destructor kills active child processes
author
Adam Dickmeiss
<adam@indexdata.dk>
Wed, 17 Mar 2010 14:06:54 +0000
(15:06 +0100)
committer
Adam Dickmeiss
<adam@indexdata.dk>
Wed, 17 Mar 2010 14:06:54 +0000
(15:06 +0100)
src/filter_cgi.cpp
patch
|
blob
|
history
diff --git
a/src/filter_cgi.cpp
b/src/filter_cgi.cpp
index
3412ca8
..
a89d03e
100644
(file)
--- a/
src/filter_cgi.cpp
+++ b/
src/filter_cgi.cpp
@@
-43,16
+43,30
@@
namespace metaproxy_1 {
class CGI::Rep {
friend class CGI;
std::list<CGI::Exec> exec_map;
class CGI::Rep {
friend class CGI;
std::list<CGI::Exec> exec_map;
+ std::map<pid_t,pid_t> children;
+ boost::mutex m_mutex;
+ public:
+ ~Rep();
};
}
}
yf::CGI::CGI() : m_p(new Rep)
{
};
}
}
yf::CGI::CGI() : m_p(new Rep)
{
+
+}
+
+yf::CGI::Rep::~Rep()
+{
+ std::map<pid_t,pid_t>::const_iterator it;
+ boost::mutex::scoped_lock lock(m_mutex);
+
+ for (it = children.begin(); it != children.end(); it++)
+ kill(it->second, SIGTERM);
}
yf::CGI::~CGI()
}
yf::CGI::~CGI()
-{ // must have a destructor because of boost::scoped_ptr
+{
}
void yf::CGI::process(mp::Package &package) const
}
void yf::CGI::process(mp::Package &package) const
@@
-90,14
+104,11
@@
void yf::CGI::process(mp::Package &package) const
int r;
pid_t pid;
int status;
int r;
pid_t pid;
int status;
- int fd;
pid = ::fork();
switch (pid)
{
case 0: /* child */
pid = ::fork();
switch (pid)
{
case 0: /* child */
- for (fd = 3; fd <= 1023; fd++)
- close(fd);
setenv("PATH_INFO", path_info.c_str(), 1);
setenv("QUERY_STRING", query_string.c_str(), 1);
r = execl(it->program.c_str(), it->program.c_str(), (char *) 0);
setenv("PATH_INFO", path_info.c_str(), 1);
setenv("QUERY_STRING", query_string.c_str(), 1);
r = execl(it->program.c_str(), it->program.c_str(), (char *) 0);
@@
-111,8
+122,18
@@
void yf::CGI::process(mp::Package &package) const
package.response() = zgdu_res;
break;
default: /* parent */
package.response() = zgdu_res;
break;
default: /* parent */
+ if (pid)
+ {
+ boost::mutex::scoped_lock lock(m_p->m_mutex);
+ m_p->children[pid] = pid;
+ }
waitpid(pid, &status, 0);
waitpid(pid, &status, 0);
+ if (pid)
+ {
+ boost::mutex::scoped_lock lock(m_p->m_mutex);
+ m_p->children.erase(pid);
+ }
zgdu_res = odr.create_HTTP_Response(
package.session(), zgdu_req->u.HTTP_Request, 200);
package.response() = zgdu_res;
zgdu_res = odr.create_HTTP_Response(
package.session(), zgdu_req->u.HTTP_Request, 200);
package.response() = zgdu_res;