Module: sip-router
Branch: 3.1
Commit: 487fef38bf962ff778f9380639cf33cf6c55ef80
URL:
http://git.sip-router.org/cgi-bin/gitweb.cgi/sip-router/?a=commit;h=487fef3…
Author: Daniel-Constantin Mierla <miconda(a)gmail.com>
Committer: Daniel-Constantin Mierla <miconda(a)gmail.com>
Date: Sun Mar 6 00:51:41 2011 +0100
core: enable dumpable flag after setuid() on Linux
- init rlimit struct for proper dbg message when core limits are not
changed
(cherry picked from commit f4136d7742b0b0bfc09a9157d573c8a7f6118b76)
---
daemonize.c | 53 +++++++++++++++++++++++++++++++++++++++++++++++++++--
daemonize.h | 2 +-
2 files changed, 52 insertions(+), 3 deletions(-)
diff --git a/daemonize.c b/daemonize.c
index 7411652..f131212 100644
--- a/daemonize.c
+++ b/daemonize.c
@@ -58,6 +58,10 @@
#include <pwd.h>
#include <grp.h>
+#ifdef __OS_linux
+#include <sys/prctl.h>
+#endif
+
#ifdef HAVE_SCHED_SETSCHEDULER
#include <sched.h>
#endif
@@ -202,6 +206,40 @@ void daemon_status_no_wait()
}
+/**
+ * enable dumpable flag for core dumping after setuid() & friends
+ * @return 0 when no critical error occured, -1 on such error
+ */
+int enable_dumpable(void)
+{
+#ifdef __OS_linux
+ struct rlimit lim;
+ /* re-enable core dumping on linux after setuid() & friends */
+ if(disable_core_dump==0) {
+ LM_DBG("trying enable core dumping...\n");
+ if(prctl(PR_GET_DUMPABLE, 0, 0, 0, 0)<=0) {
+ LM_DBG("core dumping is disabled now...\n");
+ if(prctl(PR_SET_DUMPABLE, 1, 0, 0, 0)<0) {
+ LM_WARN("cannot re-enable core dumping!\n");
+ } else {
+ LM_DBG("core dumping has just been enabled...\n");
+ if (getrlimit(RLIMIT_CORE, &lim)<0){
+ LOG(L_CRIT, "cannot get the maximum core size: %s\n",
+ strerror(errno));
+ return -1;
+ } else {
+ DBG("current core file limit: %lu (max: %lu)\n",
+ (unsigned long)lim.rlim_cur, (unsigned long)lim.rlim_max);
+ }
+ }
+ } else {
+ LM_DBG("core dumping is enabled now (%d)...\n",
+ prctl(PR_GET_DUMPABLE, 0, 0, 0, 0));
+ }
+ }
+#endif
+ return 0;
+}
/** daemon init.
*@param name - daemon name used for logging (used when opening syslog).
@@ -289,6 +327,10 @@ int daemonize(char* name, int status_wait)
exit(0);
}
}
+
+ if(enable_dumpable()<0)
+ goto error;
+
/* added by noh: create a pid file for the main process */
if (pid_file!=0){
@@ -415,6 +457,10 @@ int do_suid()
goto error;
}
}
+
+ if(enable_dumpable()<0)
+ goto error;
+
return 0;
error:
return -1;
@@ -477,7 +523,7 @@ error:
/*! \brief enable core dumps */
-int set_core_dump(int enable, int size)
+int set_core_dump(int enable, long unsigned int size)
{
struct rlimit lim;
struct rlimit newlim;
@@ -510,8 +556,11 @@ int set_core_dump(int enable, int size)
(unsigned long)lim.rlim_max);
}
goto error; /* it's an error we haven't got the size we wanted*/
+ }else{
+ newlim.rlim_cur=lim.rlim_cur;
+ newlim.rlim_max=lim.rlim_max;
+ goto done; /*nothing to do */
}
- goto done; /*nothing to do */
}else{
/* disable */
newlim.rlim_cur=0;
diff --git a/daemonize.h b/daemonize.h
index 622a710..9003a01 100644
--- a/daemonize.h
+++ b/daemonize.h
@@ -30,7 +30,7 @@
int daemonize(char* name, int daemon_status_fd_input);
int do_suid();
int increase_open_fds(int target);
-int set_core_dump(int enable, int size);
+int set_core_dump(int enable, long unsigned int size);
int mem_lock_pages();
int set_rt_prio(int prio, int policy);