summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorHarald Welte2010-12-26 22:49:27 +0100
committerAndreas Eversberg2011-02-20 11:33:53 +0100
commit0eebd3a28e968844ec459298ac36e16305cc07bb (patch)
tree2856b304b77e2837a84c69a9964edd56f76bd4bb
parentGSM MNCC: Make sure to set the MNCC_F_KEYPAD when ACKing DTMF (diff)
downloadlcr-0eebd3a28e968844ec459298ac36e16305cc07bb.tar.gz
lcr-0eebd3a28e968844ec459298ac36e16305cc07bb.tar.xz
lcr-0eebd3a28e968844ec459298ac36e16305cc07bb.zip
don't execve() a shell process but always double-fork and then exec the program directly
-rw-r--r--action.cpp4
-rw-r--r--route.c10
2 files changed, 11 insertions, 3 deletions
diff --git a/action.cpp b/action.cpp
index b7dfc58..352efb4 100644
--- a/action.cpp
+++ b/action.cpp
@@ -1976,9 +1976,11 @@ void EndpointAppPBX::action_execute(void)
end_trace();
return;
}
+#if 0
argv[i++] = (char *)"/bin/sh";
argv[i++] = (char *)"-c";
argv[i++] = command;
+#endif
argv[i++] = command;
if ((rparam = routeparam(e_action, PARAM_PARAM))) {
argv[i++] = rparam->string_value;
@@ -1999,7 +2001,7 @@ void EndpointAppPBX::action_execute(void)
case 0:
/* To be shure there are no zombies created double fork */
if ((pid2 = fork()) == 0) {
- execve("/bin/sh", argv, environ);
+ execve(command, argv, environ);
}
else {
/* Exit immediately and release the waiting parent. The subprocess falls to init because the parent died */
diff --git a/route.c b/route.c
index f72d6b0..8217ff1 100644
--- a/route.c
+++ b/route.c
@@ -1902,6 +1902,7 @@ struct route_action *EndpointAppPBX::route(struct route_ruleset *ruleset)
struct admin_list *admin;
time_t now;
struct tm *now_tm;
+ int pid2;
/* reset timeout action */
e_match_to_action = NULL;
@@ -2071,9 +2072,11 @@ struct route_action *EndpointAppPBX::route(struct route_ruleset *ruleset)
case MATCH_EXECUTE:
j = 0;
+#if 0
argv[j++] = (char *)"/bin/sh";
argv[j++] = (char *)"-c";
argv[j++] = cond->string_value;
+#endif
argv[j++] = cond->string_value;
argv[j++] = e_extdialing;
argv[j++] = (char *)numberrize_callerinfo(e_callerinfo.id, e_callerinfo.ntype, options.national, options.international);
@@ -2083,8 +2086,11 @@ struct route_action *EndpointAppPBX::route(struct route_ruleset *ruleset)
argv[j++] = isdn_port;
argv[j++] = e_callerinfo.imsi;
argv[j++] = NULL; /* check also number of args above */
- if (execve("/bin/sh", argv, environ) == 0)
- istrue = 1;
+ if (fork() == 0) {
+ if ((pid2 = fork()) == 0) {
+ execve(cond->string_value, argv, environ);
+ }
+ }
break;
case MATCH_DEFAULT: