=== modified file 'TODO' --- TODO 2009-10-18 08:47:40 +0000 +++ TODO 2009-10-18 16:09:05 +0000 @@ -18,19 +18,18 @@ * usplash ** TODO [#B] use scandir(3) instead of readdir(3) ** TODO [#B] Prefix all debug output with "Mandos plugin " + program_invocation_short_name +** TODO use error() instead of perror() ** TODO use EX_* from -** TODO use error() instead of perror() * askpass-fifo ** TODO [#B] Prefix all debug output with "Mandos plugin " + program_invocation_short_name +** TODO use error() instead of perror() ** TODO [#B] Drop privileges after opening FIFO. -** TODO use EX_* from -** TODO use error() instead of perror() * password-prompt ** TODO [#B] Prefix all debug output with "Mandos plugin " + program_invocation_short_name +** TODO use error() instead of perror() ** TODO use EX_* from -** TODO use error() instead of perror() * TODO passdev === modified file 'plugins.d/askpass-fifo.c' --- plugins.d/askpass-fifo.c 2009-09-16 23:28:39 +0000 +++ plugins.d/askpass-fifo.c 2009-10-18 16:09:05 +0000 @@ -26,13 +26,19 @@ #include /* ssize_t */ #include /* mkfifo(), S_IRUSR, S_IWUSR */ #include /* and */ -#include /* errno, EEXIST */ +#include /* errno, EACCES, ENOTDIR, ELOOP, + ENAMETOOLONG, ENOSPC, EROFS, + ENOENT, EEXIST, EFAULT, EMFILE, + ENFILE, ENOMEM, EBADF, EINVAL, EIO, + EISDIR, EFBIG */ #include /* perror() */ #include /* EXIT_FAILURE, NULL, size_t, free(), realloc(), EXIT_SUCCESS */ #include /* open(), O_RDONLY */ #include /* read(), close(), write(), STDOUT_FILENO */ +#include /* EX_OSERR, EX_OSFILE, + EX_UNAVAILABLE, EX_IOERR */ int main(__attribute__((unused))int argc, @@ -43,16 +49,46 @@ /* Create FIFO */ const char passfifo[] = "/lib/cryptsetup/passfifo"; ret = mkfifo(passfifo, S_IRUSR | S_IWUSR); - if(ret == -1 and errno != EEXIST){ + if(ret == -1){ + int e = errno; perror("mkfifo"); - return EXIT_FAILURE; + switch(e){ + case EACCES: + case ENOTDIR: + case ELOOP: + return EX_OSFILE; + case ENAMETOOLONG: + case ENOSPC: + case EROFS: + default: + return EX_OSERR; + case ENOENT: + return EX_UNAVAILABLE; /* no "/lib/cryptsetup"? */ + case EEXIST: + break; /* not an error */ + } } /* Open FIFO */ int fifo_fd = open(passfifo, O_RDONLY); if(fifo_fd == -1){ + int e = errno; perror("open"); - return EXIT_FAILURE; + switch(e){ + case EACCES: + case ENOENT: + case EFAULT: + return EX_UNAVAILABLE; + case ENAMETOOLONG: + case EMFILE: + case ENFILE: + case ENOMEM: + default: + return EX_OSERR; + case ENOTDIR: + case ELOOP: + return EX_OSFILE; + } } /* Read from FIFO */ @@ -67,16 +103,28 @@ if(tmp == NULL){ perror("realloc"); free(buf); - return EXIT_FAILURE; + return EX_OSERR; } buf = tmp; buf_allocated += blocksize; } sret = read(fifo_fd, buf + buf_len, buf_allocated - buf_len); if(sret == -1){ + int e = errno; + free(buf); + errno = e; perror("read"); - free(buf); - return EXIT_FAILURE; + switch(e){ + case EBADF: + case EFAULT: + case EINVAL: + default: + return EX_OSERR; + case EIO: + return EX_IOERR; + case EISDIR: + return EX_UNAVAILABLE; + } } buf_len += (size_t)sret; } while(sret != 0); @@ -90,13 +138,37 @@ while(written < buf_len){ sret = write(STDOUT_FILENO, buf + written, buf_len - written); if(sret == -1){ + int e = errno; + free(buf); + errno = e; perror("write"); - free(buf); - return EXIT_FAILURE; + switch(e){ + case EBADF: + case EFAULT: + case EINVAL: + return EX_OSFILE; + case EFBIG: + case EIO: + case ENOSPC: + default: + return EX_IOERR; + } } written += (size_t)sret; } free(buf); + ret = close(STDOUT_FILENO); + if(ret == -1){ + int e = errno; + perror("close"); + switch(e){ + case EBADF: + return EX_OSFILE; + case EIO: + default: + return EX_IOERR; + } + } return EXIT_SUCCESS; } === modified file 'plugins.d/splashy.c' --- plugins.d/splashy.c 2009-10-18 08:47:40 +0000 +++ plugins.d/splashy.c 2009-10-18 16:09:05 +0000 @@ -43,10 +43,14 @@ STDOUT_FILENO, _exit(), pause() */ #include /* memcmp() */ -#include /* errno */ +#include /* errno, EACCES, ENOTDIR, ELOOP, + ENOENT, ENAMETOOLONG, EMFILE, + ENFILE, ENOMEM, ENOEXEC, EINVAL, + E2BIG, EFAULT, EIO, ETXTBSY, + EISDIR, ELIBBAD, EPERM, EINTR, + ECHILD */ #include /* waitpid(), WIFEXITED(), WEXITSTATUS() */ - #include /* EX_OSERR, EX_OSFILE, EX_UNAVAILABLE */ @@ -288,7 +292,31 @@ if(not interrupted_by_signal){ const char splashy_command[] = "/sbin/splashy_update"; execl(splashy_command, splashy_command, prompt, (char *)NULL); + int e = errno; perror("execl"); + switch(e){ + case EACCES: + case ENOENT: + case ENOEXEC: + case EINVAL: + _exit(EX_UNAVAILABLE); + case ENAMETOOLONG: + case E2BIG: + case ENOMEM: + case EFAULT: + case EIO: + case EMFILE: + case ENFILE: + case ETXTBSY: + default: + _exit(EX_OSERR); + case ENOTDIR: + case ELOOP: + case EISDIR: + case ELIBBAD: + case EPERM: + _exit(EX_OSFILE); + } } free(prompt); _exit(EXIT_FAILURE);