diff options
| -rw-r--r-- | duo_openvpn.c | 24 |
1 files changed, 23 insertions, 1 deletions
diff --git a/duo_openvpn.c b/duo_openvpn.c index d7db313..b4ba6eb 100644 --- a/duo_openvpn.c +++ b/duo_openvpn.c @@ -67,10 +67,32 @@ auth_user_pass_verify(struct context *ctx, const char *args[], const char *envp[ } if (pid > 0) { + int status; + + /* openvpn process forked ok, wait for first child to exit and return its status */ + pid = waitpid(pid, &status, 0); + if (pid < 0) { + return OPENVPN_PLUGIN_FUNC_ERROR; + } + + if (WIFEXITED(status)) { + return WEXITSTATUS(status); + } + + return OPENVPN_PLUGIN_FUNC_ERROR; + } + + pid = fork(); + if (pid < 0) { + return OPENVPN_PLUGIN_FUNC_ERROR; + } + + if (pid > 0) { + /* first child forked ok, pass deferred return up to parent openvpn process */ return OPENVPN_PLUGIN_FUNC_DEFERRED; } - /* daemonize so PID 1 can reap */ + /* second child daemonizes so PID 1 can reap */ umask(0); setsid(); chdir("/"); |
