diff mbox

[2/2] Sanitise batmand process by reexecuting it

Message ID 1238581902-21257-2-git-send-email-sven.eckelmann@gmx.de
State Superseded, archived
Headers show

Commit Message

Sven Eckelmann April 1, 2009, 10:31 a.m. UTC
uclibc >=0.9.29 doesn't support threads after the call of fork in
linuxthreads mode without calling exec* first. We can now try to call
the binary again with execv to sanitise the current process and tell him
that he should not try to get into the daemon mode so we don't recursive
call batmand again.
This can fail when no linux procfs is mounted on /proc or /proc/self/exe
is a dangling symlink. In this case we continue without any changes.

Signed-off-by: Sven Eckelmann <sven.eckelmann@gmx.de>
---
 batman/posix/init.c |   28 ++++++++++++++++++++++++++--
 1 files changed, 26 insertions(+), 2 deletions(-)
diff mbox

Patch

diff --git a/batman/posix/init.c b/batman/posix/init.c
index bd10438..5dbfe17 100644
--- a/batman/posix/init.c
+++ b/batman/posix/init.c
@@ -46,7 +46,28 @@  int8_t stop;
 
 
 
-static int my_daemon(void) {
+static void re_execute(int argc, char *argv[])
+{
+	char ** new_argv = NULL;
+	char* no_detach_flag = "-D";
+	int i;
+
+	new_argv = debugMalloc( sizeof(char *const) * (argc + 2), 5005 );
+	for (i = 0; i < argc; i++ ) {
+		new_argv[i] = argv[i];
+	}
+	new_argv[argc] = no_detach_flag;
+	new_argv[argc + 1] = NULL;
+
+
+	execv("/proc/self/exe", new_argv);
+
+	/* execv can fail due to different reasons
+	   so we must be able to continue anyway */
+	debugFree(new_argv, 5005);
+}
+
+static int my_daemon(int argc, char *argv[]) {
 
 	int fd;
 
@@ -83,6 +104,9 @@  static int my_daemon(void) {
 
 	}
 
+	/* Try to restart batmand in daemon mode to be sure that it is sanitised */
+	re_execute(argc, argv);
+
 	return 0;
 
 }
@@ -652,7 +676,7 @@  void apply_init_args( int argc, char *argv[] ) {
 		/* daemonize */
 		if (debug_level == 0) {
 
-			if (no_detach == 0 && my_daemon() < 0) {
+			if (no_detach == 0 && my_daemon(argc, argv) < 0) {
 
 				printf("Error - can't fork to background: %s\n", strerror(errno));
 				restore_defaults();