aboutsummaryrefslogtreecommitdiffstats
path: root/res
diff options
context:
space:
mode:
Diffstat (limited to 'res')
-rw-r--r--res/res_agi.c17
-rw-r--r--res/res_musiconhold.c26
2 files changed, 38 insertions, 5 deletions
diff --git a/res/res_agi.c b/res/res_agi.c
index ece9c0bbe..76924d5c4 100644
--- a/res/res_agi.c
+++ b/res/res_agi.c
@@ -23,6 +23,10 @@
* \author Mark Spencer <markster@digium.com>
*/
+/*** MODULEINFO
+ <depend>working_fork</depend>
+ ***/
+
#include "asterisk.h"
ASTERISK_FILE_VERSION(__FILE__, "$Revision$")
@@ -33,6 +37,9 @@ ASTERISK_FILE_VERSION(__FILE__, "$Revision$")
#include <sys/wait.h>
#include <sys/stat.h>
#include <pthread.h>
+#ifdef HAVE_CAP
+#include <sys/capability.h>
+#endif /* HAVE_CAP */
#include "asterisk/paths.h" /* use many ast_config_AST_*_DIR */
#include "asterisk/network.h"
@@ -667,6 +674,16 @@ static enum agi_result launch_script(struct ast_channel *chan, char *script, cha
return AGI_RESULT_FAILURE;
}
if (!pid) {
+#ifdef HAVE_CAP
+ cap_t cap = cap_from_text("cap_net_admin-eip");
+
+ if (cap_set_proc(cap)) {
+ /* Careful with order! Logging cannot happen after we close FDs */
+ ast_log(LOG_WARNING, "Unable to remove capabilities.\n");
+ }
+ cap_free(cap);
+#endif
+
/* Pass paths to AGI via environmental variables */
setenv("AST_CONFIG_DIR", ast_config_AST_CONFIG_DIR, 1);
setenv("AST_CONFIG_FILE", ast_config_AST_CONFIG_FILE, 1);
diff --git a/res/res_musiconhold.c b/res/res_musiconhold.c
index 9656ae02b..3733fe701 100644
--- a/res/res_musiconhold.c
+++ b/res/res_musiconhold.c
@@ -28,6 +28,7 @@
/*** MODULEINFO
<conflict>win32</conflict>
<use>dahdi</use>
+ <depend>working_fork</depend>
***/
#include "asterisk.h"
@@ -49,6 +50,9 @@ ASTERISK_FILE_VERSION(__FILE__, "$Revision$")
#ifdef HAVE_DAHDI
#include <dahdi/user.h>
#endif
+#ifdef HAVE_CAP
+#include <sys/capability.h>
+#endif /* HAVE_CAP */
#include "asterisk/lock.h"
#include "asterisk/file.h"
@@ -491,7 +495,15 @@ static int spawn_mp3(struct mohclass *class)
return -1;
}
if (!class->pid) {
+ /* Child */
int x;
+#ifdef HAVE_CAP
+ cap_t cap;
+#endif
+ if (strcasecmp(class->dir, "nodir") && chdir(class->dir) < 0) {
+ ast_log(LOG_WARNING, "chdir() failed: %s\n", strerror(errno));
+ _exit(1);
+ }
if (ast_opt_high_priority)
ast_set_priority(0);
@@ -500,6 +512,14 @@ static int spawn_mp3(struct mohclass *class)
signal(SIGPIPE, SIG_DFL);
pthread_sigmask(SIG_UNBLOCK, &signal_set, NULL);
+#ifdef HAVE_CAP
+ cap = cap_from_text("cap_net_admin-eip");
+
+ if (cap_set_proc(cap)) {
+ ast_log(LOG_WARNING, "Unable to remove capabilities.\n");
+ }
+ cap_free(cap);
+#endif
close(fds[0]);
/* Stdout goes to pipe */
dup2(fds[1], STDOUT_FILENO);
@@ -509,12 +529,8 @@ static int spawn_mp3(struct mohclass *class)
close(x);
}
}
- /* Child */
- if (strcasecmp(class->dir, "nodir") && chdir(class->dir) < 0) {
- ast_log(LOG_WARNING, "chdir() failed: %s\n", strerror(errno));
- _exit(1);
- }
setpgid(0, getpid());
+
if (ast_test_flag(class, MOH_CUSTOM)) {
execv(argv[0], argv);
} else {