[2/2] Sanitise batmand process by reexecuting it
Commit Message
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(-)
@@ -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();