=== modified file 'plugins.d/usplash.c' --- plugins.d/usplash.c 2008-09-26 04:54:35 +0000 +++ plugins.d/usplash.c 2008-09-26 18:03:10 +0000 @@ -1,25 +1,32 @@ #define _GNU_SOURCE /* asprintf() */ #include /* sig_atomic_t, struct sigaction, - sigemptyset(), sigaddset(), - sigaction, SIGINT, SIG_IGN, SIGHUP, - SIGTERM, kill(), SIGKILL */ + sigemptyset(), sigaddset(), SIGINT, + SIGHUP, SIGTERM, sigaction(), + SIG_IGN, kill(), SIGKILL */ +#include /* bool, false, true */ +#include /* open(), O_WRONLY, O_RDONLY */ +#include /* errno, EINTR */ +#include /* size_t, ssize_t, pid_t, DIR, + struct dirent */ #include /* NULL */ +#include /* strlen(), memcmp() */ +#include /* asprintf(), perror() */ +#include /* close(), write(), readlink(), + read(), STDOUT_FILENO, sleep(), + fork(), setuid(), geteuid(), + setsid(), chdir(), dup2(), + STDERR_FILENO, execv() */ +#include /* free(), EXIT_FAILURE, strtoul(), + realloc(), EXIT_SUCCESS, malloc(), + _exit() */ #include /* getenv() */ -#include /* asprintf(), perror() */ -#include /* EXIT_FAILURE, EXIT_SUCCESS, - strtoul(), free() */ -#include /* pid_t, DIR, struct dirent, - ssize_t */ #include /* opendir(), readdir(), closedir() */ -#include /* readlink(), fork(), execl(), - _exit */ -#include /* memcmp() */ + + + #include /* and */ -#include /* bool, false, true */ -#include /* errno */ #include /* waitpid(), WIFEXITED(), WEXITSTATUS() */ -#include /* open(), O_RDONLY */ sig_atomic_t interrupted_by_signal = 0; @@ -44,10 +51,11 @@ }while(fifo_fd == -1); const char *cmd_line; + size_t cmd_line_len; char *cmd_line_alloc = NULL; if(arg == NULL){ cmd_line = cmd; - ret = (int)strlen(cmd); + cmd_line_len = strlen(cmd); }else{ do{ ret = asprintf(&cmd_line_alloc, "%s %s", cmd, arg); @@ -59,9 +67,9 @@ } }while(ret == -1); cmd_line = cmd_line_alloc; + cmd_line_len = (size_t)ret + 1; } - size_t cmd_line_len = (size_t)ret + 1; size_t written = 0; while(not interrupted_by_signal and written < cmd_line_len){ ret = write(fifo_fd, cmd_line + written, @@ -103,7 +111,7 @@ { const char *const cryptsource = getenv("cryptsource"); const char *const crypttarget = getenv("crypttarget"); - const char *const prompt_start = "Enter passphrase to unlock the disk"; + const char prompt_start[] = "Enter passphrase to unlock the disk"; if(cryptsource == NULL){ if(crypttarget == NULL){ @@ -159,6 +167,9 @@ } sret = readlink(exe_link, exe_target, sizeof(exe_target)); free(exe_link); + if(sret == -1){ + continue; + } } if((sret == ((ssize_t)sizeof(exe_target)-1)) and (memcmp(usplash_name, exe_target, @@ -371,7 +382,7 @@ /* Print password to stdout */ size_t written = 0; - do{ + while(written < buf_len){ do{ sret = write(STDOUT_FILENO, buf + written, buf_len - written); if(sret == -1){ @@ -388,10 +399,11 @@ if(interrupted_by_signal or an_error_occured){ break; } - written += (size_t)sret; - }while(written < buf_len); + } + free(buf); if(not interrupted_by_signal and not an_error_occured){ + free(cmdline); return EXIT_SUCCESS; } break; /* Big */ @@ -406,7 +418,8 @@ size_t position = 0; while(position < cmdline_len){ char **tmp = realloc(cmdline_argv, - (sizeof(char *) * (size_t)(cmdline_argc + 2))); + (sizeof(char *) + * (size_t)(cmdline_argc + 2))); if(tmp == NULL){ perror("realloc"); free(cmdline_argv); @@ -418,6 +431,7 @@ position += strlen(cmdline + position) + 1; } cmdline_argv[cmdline_argc] = NULL; + free(cmdline); } /* Kill old usplash */ kill(usplash_pid, SIGTERM); @@ -449,7 +463,11 @@ } execv(usplash_name, cmdline_argv); + perror("execv"); + free(cmdline_argv); + _exit(EXIT_FAILURE); } + free(cmdline_argv); sleep(2); if(not usplash_write("PULSATE", NULL) and (errno != EINTR)){