From: Carl Worth Date: Mon, 6 May 2013 18:57:24 +0000 (-0700) Subject: Remove useless fork before executing wrapped program. X-Git-Url: https://git.cworth.org/git?p=fips;a=commitdiff_plain;h=540a35220007443b3a63998e6c0b6a205195444f Remove useless fork before executing wrapped program. The fork did nothing for us since the parent simply waited on the child and then exited. It's simpler to simply exec the wrapped program, (which simplifies running fips within a debugger, etc.). --- diff --git a/execute.c b/execute.c index 68a60bf..0719e2d 100644 --- a/execute.c +++ b/execute.c @@ -282,63 +282,12 @@ find_libfips_path (void *ctx, const char *program) exit (1); } -/* After forking, set LD_PRELOAD to preload libfips-{32,64}.so within - * child environment, then exec given arguments. - */ -static int -fork_exec_with_fips_preload_and_wait (char * const argv[]) -{ - pid_t pid; - int i, status; - - pid = fork (); - - /* Child */ - if (pid == 0) { - void *ctx = talloc_new (NULL); - char *lib_path; - char *ld_preload_value; - - lib_path = find_libfips_path (ctx, argv[0]); - - ld_preload_value = getenv ("LD_PRELOAD"); - - if (ld_preload_value) { - ld_preload_value = talloc_asprintf(ctx, "%s:%s", - ld_preload_value, - lib_path); - } else { - ld_preload_value = lib_path; - } - - setenv ("LD_PRELOAD", ld_preload_value, 1); - - talloc_free (ctx); - - execvp (argv[0], argv); - fprintf (stderr, "Failed to execute:"); - for (i = 0; argv[i]; i++) { - fprintf (stderr, " %s", argv[i]); - } - fprintf (stderr, "\n"); - exit (1); - } - - /* Parent */ - waitpid (pid, &status, 0); - if (WIFEXITED (status)) { - return (WEXITSTATUS (status)); - } - if (WIFSIGNALED (status)) { - fprintf (stderr, "Child terminated by signal %d\n", - WTERMSIG (status)); - } - return 1; -} - int execute_with_fips_preload (int argc, char * const argv[]) { + void *ctx = talloc_new (NULL); + char *lib_path; + char *ld_preload_value; char **execvp_args; int i; @@ -355,5 +304,27 @@ execute_with_fips_preload (int argc, char * const argv[]) /* execvp needs final NULL */ execvp_args[i] = NULL; - return fork_exec_with_fips_preload_and_wait (execvp_args); + lib_path = find_libfips_path (ctx, argv[0]); + + ld_preload_value = getenv ("LD_PRELOAD"); + + if (ld_preload_value) { + ld_preload_value = talloc_asprintf(ctx, "%s:%s", + ld_preload_value, + lib_path); + } else { + ld_preload_value = lib_path; + } + + setenv ("LD_PRELOAD", ld_preload_value, 1); + + talloc_free (ctx); + + execvp (argv[0], argv); + fprintf (stderr, "Failed to execute:"); + for (i = 0; argv[i]; i++) { + fprintf (stderr, " %s", argv[i]); + } + fprintf (stderr, "\n"); + exit (1); }