[ecryptfs-utils/f16] do not crash in pam module when non-existent user name is used (#859766)
Michal Hlavinka
mhlavink at fedoraproject.org
Thu Sep 27 14:12:56 UTC 2012
commit d12df829b200885e0d9dce44eb06e90b4e9b4c6b
Author: Michal Hlavinka <mhlavink at redhat.com>
Date: Thu Sep 27 16:12:52 2012 +0200
do not crash in pam module when non-existent user name is used (#859766)
- fix Werror messages in new build environment
ecryptfs-utils-75-werror.patch | 167 +++++++++++++++++++++++++--------------
ecryptfs-utils-87-pamdata.patch | 47 ++++++-----
ecryptfs-utils-87-syslog.patch | 56 +++++++-------
ecryptfs-utils.spec | 9 ++-
4 files changed, 170 insertions(+), 109 deletions(-)
---
diff --git a/ecryptfs-utils-75-werror.patch b/ecryptfs-utils-75-werror.patch
index e60f5b4..63a4f0f 100644
--- a/ecryptfs-utils-75-werror.patch
+++ b/ecryptfs-utils-75-werror.patch
@@ -1,6 +1,6 @@
-diff -up ecryptfs-utils-99/src/key_mod/ecryptfs_key_mod_pkcs11_helper.c.werror ecryptfs-utils-99/src/key_mod/ecryptfs_key_mod_pkcs11_helper.c
---- ecryptfs-utils-99/src/key_mod/ecryptfs_key_mod_pkcs11_helper.c.werror 2012-07-23 18:59:05.223406369 +0200
-+++ ecryptfs-utils-99/src/key_mod/ecryptfs_key_mod_pkcs11_helper.c 2012-07-23 18:59:05.237406445 +0200
+diff -up ecryptfs-utils-100/src/key_mod/ecryptfs_key_mod_pkcs11_helper.c.werror ecryptfs-utils-100/src/key_mod/ecryptfs_key_mod_pkcs11_helper.c
+--- ecryptfs-utils-100/src/key_mod/ecryptfs_key_mod_pkcs11_helper.c.werror 2012-08-20 15:46:19.795460481 +0200
++++ ecryptfs-utils-100/src/key_mod/ecryptfs_key_mod_pkcs11_helper.c 2012-08-20 15:46:19.844460878 +0200
@@ -99,7 +99,7 @@ static int ecryptfs_pkcs11h_deserialize(
pkcs11h_data->serialized_id = NULL;
}
@@ -150,9 +150,9 @@ diff -up ecryptfs-utils-99/src/key_mod/ecryptfs_key_mod_pkcs11_helper.c.werror e
subgraph_key_ctx = (struct pkcs11h_subgraph_key_ctx *)(*foo);
-diff -up ecryptfs-utils-99/src/libecryptfs/ecryptfs-stat.c.werror ecryptfs-utils-99/src/libecryptfs/ecryptfs-stat.c
---- ecryptfs-utils-99/src/libecryptfs/ecryptfs-stat.c.werror 2012-05-18 21:06:17.000000000 +0200
-+++ ecryptfs-utils-99/src/libecryptfs/ecryptfs-stat.c 2012-07-23 18:59:05.238406451 +0200
+diff -up ecryptfs-utils-100/src/libecryptfs/ecryptfs-stat.c.werror ecryptfs-utils-100/src/libecryptfs/ecryptfs-stat.c
+--- ecryptfs-utils-100/src/libecryptfs/ecryptfs-stat.c.werror 2012-05-18 21:06:17.000000000 +0200
++++ ecryptfs-utils-100/src/libecryptfs/ecryptfs-stat.c 2012-08-20 15:46:19.845460886 +0200
@@ -146,7 +146,7 @@ int ecryptfs_parse_stat(struct ecryptfs_
if (buf_size < (ECRYPTFS_FILE_SIZE_BYTES
+ MAGIC_ECRYPTFS_MARKER_SIZE_BYTES
@@ -162,9 +162,9 @@ diff -up ecryptfs-utils-99/src/libecryptfs/ecryptfs-stat.c.werror ecryptfs-utils
"bytes; there are only [%zu] bytes\n", __FUNCTION__,
(ECRYPTFS_FILE_SIZE_BYTES
+ MAGIC_ECRYPTFS_MARKER_SIZE_BYTES
-diff -up ecryptfs-utils-99/src/libecryptfs/key_management.c.werror ecryptfs-utils-99/src/libecryptfs/key_management.c
---- ecryptfs-utils-99/src/libecryptfs/key_management.c.werror 2012-07-23 18:59:05.219406346 +0200
-+++ ecryptfs-utils-99/src/libecryptfs/key_management.c 2012-07-23 18:59:05.238406451 +0200
+diff -up ecryptfs-utils-100/src/libecryptfs/key_management.c.werror ecryptfs-utils-100/src/libecryptfs/key_management.c
+--- ecryptfs-utils-100/src/libecryptfs/key_management.c.werror 2012-08-20 15:46:19.791460449 +0200
++++ ecryptfs-utils-100/src/libecryptfs/key_management.c 2012-08-20 15:46:19.845460886 +0200
@@ -228,7 +228,6 @@ int ecryptfs_wrap_passphrase_file(char *
int rc = 0;
ssize_t size;
@@ -173,9 +173,9 @@ diff -up ecryptfs-utils-99/src/libecryptfs/key_management.c.werror ecryptfs-util
char *p = NULL;
char decrypted_passphrase[ECRYPTFS_MAX_PASSPHRASE_BYTES + 1];
-diff -up ecryptfs-utils-99/src/pam_ecryptfs/pam_ecryptfs.c.werror ecryptfs-utils-99/src/pam_ecryptfs/pam_ecryptfs.c
---- ecryptfs-utils-99/src/pam_ecryptfs/pam_ecryptfs.c.werror 2012-07-11 16:03:17.000000000 +0200
-+++ ecryptfs-utils-99/src/pam_ecryptfs/pam_ecryptfs.c 2012-07-23 18:59:38.714596789 +0200
+diff -up ecryptfs-utils-100/src/pam_ecryptfs/pam_ecryptfs.c.werror ecryptfs-utils-100/src/pam_ecryptfs/pam_ecryptfs.c
+--- ecryptfs-utils-100/src/pam_ecryptfs/pam_ecryptfs.c.werror 2012-08-02 15:20:17.000000000 +0200
++++ ecryptfs-utils-100/src/pam_ecryptfs/pam_ecryptfs.c 2012-08-20 15:48:15.233393985 +0200
@@ -47,31 +47,6 @@
#define PRIVATE_DIR "Private"
@@ -208,7 +208,20 @@ diff -up ecryptfs-utils-99/src/pam_ecryptfs/pam_ecryptfs.c.werror ecryptfs-utils
/* returns: 0 if file does not exist, 1 if it exists, <0 for error */
static int file_exists_dotecryptfs(const char *homedir, char *filename)
{
-@@ -216,8 +191,6 @@ PAM_EXTERN int pam_sm_authenticate(pam_h
+@@ -110,10 +85,8 @@ static int wrap_passphrase_if_necessary(
+ stat(wrapped_pw_filename, &s) != 0 &&
+ passphrase != NULL && *passphrase != '\0' &&
+ username != NULL && *username != '\0') {
+- setuid(uid);
+- rc = ecryptfs_wrap_passphrase_file(wrapped_pw_filename, passphrase, salt, unwrapped_pw_filename);
+- if (rc != 0) {
+- syslog(LOG_ERR, "pam_ecryptfs: Error wrapping cleartext password; " "rc = [%d]\n", rc);
++ if ((rc = setuid(uid))<0 || ((rc = ecryptfs_wrap_passphrase_file(wrapped_pw_filename, passphrase, salt, unwrapped_pw_filename)) != 0)) {
++ syslog(LOG_ERR, "pam_ecryptfs: Error wrapping cleartext password; " "rc = [%d]\n", rc);
+ }
+ return rc;
+ }
+@@ -211,8 +184,6 @@ PAM_EXTERN int pam_sm_authenticate(pam_h
if ((argc == 1)
&& (memcmp(argv[0], "unwrap\0", 7) == 0)) {
char *wrapped_pw_filename;
@@ -217,7 +230,7 @@ diff -up ecryptfs-utils-99/src/pam_ecryptfs/pam_ecryptfs.c.werror ecryptfs-utils
rc = asprintf(
&wrapped_pw_filename, "%s/.ecryptfs/%s",
-@@ -309,8 +282,6 @@ static int private_dir(pam_handle_t *pam
+@@ -304,8 +275,6 @@ static int private_dir(pam_handle_t *pam
char *autoumount = "auto-umount";
struct stat s;
pid_t pid;
@@ -226,7 +239,7 @@ diff -up ecryptfs-utils-99/src/pam_ecryptfs/pam_ecryptfs.c.werror ecryptfs-utils
if ((pwd = fetch_pwd(pamh)) == NULL) {
/* fetch_pwd() logged a message */
-@@ -356,7 +327,7 @@ static int private_dir(pam_handle_t *pam
+@@ -351,7 +320,7 @@ static int private_dir(pam_handle_t *pam
if (stat(recorded, &s) != 0 && stat("/usr/share/ecryptfs-utils/ecryptfs-record-passphrase", &s) == 0) {
/* User has not recorded their passphrase */
unlink("/var/lib/update-notifier/user.d/ecryptfs-record-passphrase");
@@ -235,7 +248,7 @@ diff -up ecryptfs-utils-99/src/pam_ecryptfs/pam_ecryptfs.c.werror ecryptfs-utils
fd = open("/var/lib/update-notifier/dpkg-run-stamp", O_WRONLY|O_CREAT|O_NONBLOCK, 0666);
close(fd);
}
-@@ -435,7 +406,6 @@ PAM_EXTERN int pam_sm_chauthtok(pam_hand
+@@ -430,7 +399,6 @@ PAM_EXTERN int pam_sm_chauthtok(pam_hand
char *old_passphrase = NULL;
char *new_passphrase = NULL;
char *wrapped_pw_filename;
@@ -243,7 +256,7 @@ diff -up ecryptfs-utils-99/src/pam_ecryptfs/pam_ecryptfs.c.werror ecryptfs-utils
char salt[ECRYPTFS_SALT_SIZE];
char salt_hex[ECRYPTFS_SALT_SIZE_HEX];
pid_t child_pid, tmp_pid;
-@@ -450,15 +420,15 @@ PAM_EXTERN int pam_sm_chauthtok(pam_hand
+@@ -445,15 +413,15 @@ PAM_EXTERN int pam_sm_chauthtok(pam_hand
uid = pwd->pw_uid;
gid = pwd->pw_gid;
homedir = pwd->pw_dir;
@@ -262,9 +275,34 @@ diff -up ecryptfs-utils-99/src/pam_ecryptfs/pam_ecryptfs.c.werror ecryptfs-utils
syslog(LOG_ERR, "pam_ecryptfs: geteuid error");
goto outnouid;
}
-diff -up ecryptfs-utils-99/src/utils/mount.ecryptfs.c.werror ecryptfs-utils-99/src/utils/mount.ecryptfs.c
---- ecryptfs-utils-99/src/utils/mount.ecryptfs.c.werror 2012-07-23 18:59:05.234406430 +0200
-+++ ecryptfs-utils-99/src/utils/mount.ecryptfs.c 2012-07-23 18:59:05.239406457 +0200
+@@ -512,7 +480,10 @@ PAM_EXTERN int pam_sm_chauthtok(pam_hand
+ char passphrase[ECRYPTFS_MAX_PASSWORD_LENGTH + 1];
+
+ /* temp regain uid 0 to drop privs */
+- seteuid(oeuid);
++ if (seteuid(oeuid) < 0) {
++ syslog(LOG_ERR, "pam_ecryptfs: seteuid error");
++ goto out_child;
++ }
+ /* setgroups() already called */
+ if (setgid(gid) < 0 || setuid(uid) < 0)
+ goto out_child;
+@@ -537,9 +508,9 @@ out_child:
+ free(wrapped_pw_filename);
+ out:
+
+- seteuid(oeuid);
+- setegid(oegid);
+- setgroups(ngids, groups);
++ rc = seteuid(oeuid);
++ rc = setegid(oegid);
++ rc = setgroups(ngids, groups);
+
+ outnouid:
+ return rc;
+diff -up ecryptfs-utils-100/src/utils/mount.ecryptfs.c.werror ecryptfs-utils-100/src/utils/mount.ecryptfs.c
+--- ecryptfs-utils-100/src/utils/mount.ecryptfs.c.werror 2012-08-20 15:46:19.805460562 +0200
++++ ecryptfs-utils-100/src/utils/mount.ecryptfs.c 2012-08-20 15:46:19.847460902 +0200
@@ -34,6 +34,7 @@
#include <sys/mount.h>
#include <sys/stat.h>
@@ -273,9 +311,9 @@ diff -up ecryptfs-utils-99/src/utils/mount.ecryptfs.c.werror ecryptfs-utils-99/s
#include "config.h"
#include "ecryptfs.h"
#include "decision_graph.h"
-diff -up ecryptfs-utils-99/src/utils/mount.ecryptfs_private.c.werror ecryptfs-utils-99/src/utils/mount.ecryptfs_private.c
---- ecryptfs-utils-99/src/utils/mount.ecryptfs_private.c.werror 2012-07-23 18:59:05.229406400 +0200
-+++ ecryptfs-utils-99/src/utils/mount.ecryptfs_private.c 2012-07-23 18:59:05.240406463 +0200
+diff -up ecryptfs-utils-100/src/utils/mount.ecryptfs_private.c.werror ecryptfs-utils-100/src/utils/mount.ecryptfs_private.c
+--- ecryptfs-utils-100/src/utils/mount.ecryptfs_private.c.werror 2012-08-20 15:46:19.801460530 +0200
++++ ecryptfs-utils-100/src/utils/mount.ecryptfs_private.c 2012-08-20 15:46:19.847460902 +0200
@@ -95,7 +95,7 @@ int read_config(char *pw_dir, int uid, c
*s = strdup(e->mnt_fsname);
if (!*s)
@@ -285,9 +323,20 @@ diff -up ecryptfs-utils-99/src/utils/mount.ecryptfs_private.c.werror ecryptfs-ut
return 0;
}
-diff -up ecryptfs-utils-99/src/utils/test.c.werror ecryptfs-utils-99/src/utils/test.c
---- ecryptfs-utils-99/src/utils/test.c.werror 2012-05-18 21:06:17.000000000 +0200
-+++ ecryptfs-utils-99/src/utils/test.c 2012-07-23 18:59:05.240406463 +0200
+@@ -686,8 +686,8 @@ int main(int argc, char *argv[]) {
+ * update mtab for us, and replace the current process.
+ * Do not use the umount.ecryptfs helper (-i).
+ */
+- setresuid(0,0,0);
+- setresgid(0,0,0);
++ rc=setresuid(0,0,0);
++ rc=setresgid(0,0,0);
+ clearenv();
+
+ /* Since we're doing a lazy unmount anyway, just unmount the current
+diff -up ecryptfs-utils-100/src/utils/test.c.werror ecryptfs-utils-100/src/utils/test.c
+--- ecryptfs-utils-100/src/utils/test.c.werror 2012-05-18 21:06:17.000000000 +0200
++++ ecryptfs-utils-100/src/utils/test.c 2012-08-20 15:46:19.847460902 +0200
@@ -281,7 +281,7 @@ int ecryptfs_encrypt_page(int page_cache
struct inode *lower_inode;
struct ecryptfs_crypt_stat *crypt_stat;
@@ -297,9 +346,9 @@ diff -up ecryptfs-utils-99/src/utils/test.c.werror ecryptfs-utils-99/src/utils/t
int orig_byte_offset = 0;
int num_extents_per_page;
#define ECRYPTFS_PAGE_STATE_UNREAD 0
-diff -up ecryptfs-utils-99/tests/kernel/directory-concurrent/test.c.werror ecryptfs-utils-99/tests/kernel/directory-concurrent/test.c
---- ecryptfs-utils-99/tests/kernel/directory-concurrent/test.c.werror 2012-05-18 21:06:17.000000000 +0200
-+++ ecryptfs-utils-99/tests/kernel/directory-concurrent/test.c 2012-07-23 18:59:05.240406463 +0200
+diff -up ecryptfs-utils-100/tests/kernel/directory-concurrent/test.c.werror ecryptfs-utils-100/tests/kernel/directory-concurrent/test.c
+--- ecryptfs-utils-100/tests/kernel/directory-concurrent/test.c.werror 2012-05-18 21:06:17.000000000 +0200
++++ ecryptfs-utils-100/tests/kernel/directory-concurrent/test.c 2012-08-20 15:46:19.848460910 +0200
@@ -149,7 +149,7 @@ int hang_check(int option, const char *f
int test_dirs(const char *path, const int max_dirs)
@@ -309,9 +358,22 @@ diff -up ecryptfs-utils-99/tests/kernel/directory-concurrent/test.c.werror ecryp
char *filename;
size_t len = strlen(path) + 32;
int ret = TEST_PASSED;
-diff -up ecryptfs-utils-99/tests/kernel/extend-file-random/test.c.werror ecryptfs-utils-99/tests/kernel/extend-file-random/test.c
---- ecryptfs-utils-99/tests/kernel/extend-file-random/test.c.werror 2012-05-18 21:06:17.000000000 +0200
-+++ ecryptfs-utils-99/tests/kernel/extend-file-random/test.c 2012-07-23 18:59:05.241406469 +0200
+diff -up ecryptfs-utils-100/tests/kernel/enospc/test.c.werror ecryptfs-utils-100/tests/kernel/enospc/test.c
+--- ecryptfs-utils-100/tests/kernel/enospc/test.c.werror 2012-08-02 15:20:17.000000000 +0200
++++ ecryptfs-utils-100/tests/kernel/enospc/test.c 2012-08-20 15:46:19.848460910 +0200
+@@ -37,9 +37,6 @@
+ int test_exercise(char *filename, ssize_t size)
+ {
+ int fd;
+- ssize_t i;
+- ssize_t n;
+- struct stat statbuf;
+ ssize_t nbytes = size;
+ int ret = TEST_FAILED;
+
+diff -up ecryptfs-utils-100/tests/kernel/extend-file-random/test.c.werror ecryptfs-utils-100/tests/kernel/extend-file-random/test.c
+--- ecryptfs-utils-100/tests/kernel/extend-file-random/test.c.werror 2012-05-18 21:06:17.000000000 +0200
++++ ecryptfs-utils-100/tests/kernel/extend-file-random/test.c 2012-08-20 15:46:19.848460910 +0200
@@ -48,7 +48,7 @@ int test_write(int fd, char *buffer, siz
}
@@ -337,9 +399,9 @@ diff -up ecryptfs-utils-99/tests/kernel/extend-file-random/test.c.werror ecryptf
len, offset, strerror(errno));
return TEST_FAILED;
}
-diff -up ecryptfs-utils-99/tests/kernel/file-concurrent/test.c.werror ecryptfs-utils-99/tests/kernel/file-concurrent/test.c
---- ecryptfs-utils-99/tests/kernel/file-concurrent/test.c.werror 2012-05-18 21:06:17.000000000 +0200
-+++ ecryptfs-utils-99/tests/kernel/file-concurrent/test.c 2012-07-23 18:59:05.241406469 +0200
+diff -up ecryptfs-utils-100/tests/kernel/file-concurrent/test.c.werror ecryptfs-utils-100/tests/kernel/file-concurrent/test.c
+--- ecryptfs-utils-100/tests/kernel/file-concurrent/test.c.werror 2012-05-18 21:06:17.000000000 +0200
++++ ecryptfs-utils-100/tests/kernel/file-concurrent/test.c 2012-08-20 15:46:19.849460918 +0200
@@ -177,7 +177,7 @@ int hang_check(int option, const char *f
int test_files(const char *path, const int max_files)
@@ -349,9 +411,9 @@ diff -up ecryptfs-utils-99/tests/kernel/file-concurrent/test.c.werror ecryptfs-u
char *filename;
size_t len = strlen(path) + 32;
int ret = TEST_PASSED;
-diff -up ecryptfs-utils-99/tests/kernel/inode-race-stat/test.c.werror ecryptfs-utils-99/tests/kernel/inode-race-stat/test.c
---- ecryptfs-utils-99/tests/kernel/inode-race-stat/test.c.werror 2012-05-18 21:06:17.000000000 +0200
-+++ ecryptfs-utils-99/tests/kernel/inode-race-stat/test.c 2012-07-23 18:59:05.241406469 +0200
+diff -up ecryptfs-utils-100/tests/kernel/inode-race-stat/test.c.werror ecryptfs-utils-100/tests/kernel/inode-race-stat/test.c
+--- ecryptfs-utils-100/tests/kernel/inode-race-stat/test.c.werror 2012-08-02 15:20:17.000000000 +0200
++++ ecryptfs-utils-100/tests/kernel/inode-race-stat/test.c 2012-08-20 15:46:19.849460918 +0200
@@ -106,7 +106,6 @@ static void do_test(const int fdin, cons
{
for (;;) {
@@ -369,7 +431,7 @@ diff -up ecryptfs-utils-99/tests/kernel/inode-race-stat/test.c.werror ecryptfs-u
ret = check_size(filename, sz);
switch (ret) {
-@@ -290,7 +289,7 @@ int main(int argc, char **argv)
+@@ -307,7 +306,7 @@ int main(int argc, char **argv)
}
/* Now tell children to stat the file */
@@ -378,7 +440,7 @@ diff -up ecryptfs-utils-99/tests/kernel/inode-race-stat/test.c.werror ecryptfs-u
for (i = 0; i < threads; i++) {
if (write(pipe_to[i][1], cmd, strlen(cmd)+1) < 0) {
fprintf(stderr, "write to pipe failed: %s\n",
-@@ -347,6 +346,7 @@ abort:
+@@ -364,6 +363,7 @@ abort:
int ret;
ret = write(pipe_to[i][1], cmd, 1);
@@ -386,9 +448,9 @@ diff -up ecryptfs-utils-99/tests/kernel/inode-race-stat/test.c.werror ecryptfs-u
(void)waitpid(pids[i], &status, 0);
(void)close(pipe_to[i][1]);
-diff -up ecryptfs-utils-99/tests/kernel/lp-509180/test.c.werror ecryptfs-utils-99/tests/kernel/lp-509180/test.c
---- ecryptfs-utils-99/tests/kernel/lp-509180/test.c.werror 2012-05-18 21:06:17.000000000 +0200
-+++ ecryptfs-utils-99/tests/kernel/lp-509180/test.c 2012-07-23 18:59:05.242406474 +0200
+diff -up ecryptfs-utils-100/tests/kernel/lp-509180/test.c.werror ecryptfs-utils-100/tests/kernel/lp-509180/test.c
+--- ecryptfs-utils-100/tests/kernel/lp-509180/test.c.werror 2012-05-18 21:06:17.000000000 +0200
++++ ecryptfs-utils-100/tests/kernel/lp-509180/test.c 2012-08-20 15:46:19.850460926 +0200
@@ -48,7 +48,6 @@ int main(int argc, char **argv)
int fd;
int opt, flags = 0;
@@ -397,9 +459,9 @@ diff -up ecryptfs-utils-99/tests/kernel/lp-509180/test.c.werror ecryptfs-utils-9
char *file;
unsigned char buffer[1];
-diff -up ecryptfs-utils-99/tests/kernel/trunc-file/test.c.werror ecryptfs-utils-99/tests/kernel/trunc-file/test.c
---- ecryptfs-utils-99/tests/kernel/trunc-file/test.c.werror 2012-05-18 21:06:17.000000000 +0200
-+++ ecryptfs-utils-99/tests/kernel/trunc-file/test.c 2012-07-23 18:59:05.242406474 +0200
+diff -up ecryptfs-utils-100/tests/kernel/trunc-file/test.c.werror ecryptfs-utils-100/tests/kernel/trunc-file/test.c
+--- ecryptfs-utils-100/tests/kernel/trunc-file/test.c.werror 2012-05-18 21:06:17.000000000 +0200
++++ ecryptfs-utils-100/tests/kernel/trunc-file/test.c 2012-08-20 15:46:19.850460926 +0200
@@ -39,7 +39,7 @@
int write_buff(int fd, unsigned char *data, ssize_t size)
@@ -454,16 +516,3 @@ diff -up ecryptfs-utils-99/tests/kernel/trunc-file/test.c.werror ecryptfs-utils-
exit(TEST_ERROR);
}
-diff -up ecryptfs-utils-100/tests/kernel/enospc/test.c.newfix ecryptfs-utils-100/tests/kernel/enospc/test.c
---- ecryptfs-utils-100/tests/kernel/enospc/test.c.newfix 2012-08-03 11:08:28.121411674 +0200
-+++ ecryptfs-utils-100/tests/kernel/enospc/test.c 2012-08-03 11:08:28.139411811 +0200
-@@ -37,9 +37,6 @@
- int test_exercise(char *filename, ssize_t size)
- {
- int fd;
-- ssize_t i;
-- ssize_t n;
-- struct stat statbuf;
- ssize_t nbytes = size;
- int ret = TEST_FAILED;
-
diff --git a/ecryptfs-utils-87-pamdata.patch b/ecryptfs-utils-87-pamdata.patch
index 8a46a85..bc8319d 100644
--- a/ecryptfs-utils-87-pamdata.patch
+++ b/ecryptfs-utils-87-pamdata.patch
@@ -1,6 +1,6 @@
-diff -up ecryptfs-utils-99/src/pam_ecryptfs/pam_ecryptfs.c.pamdata ecryptfs-utils-99/src/pam_ecryptfs/pam_ecryptfs.c
---- ecryptfs-utils-99/src/pam_ecryptfs/pam_ecryptfs.c.pamdata 2012-07-23 20:16:39.161357208 +0200
-+++ ecryptfs-utils-99/src/pam_ecryptfs/pam_ecryptfs.c 2012-07-23 20:16:49.952442084 +0200
+diff -up ecryptfs-utils-100/src/pam_ecryptfs/pam_ecryptfs.c.pamdata ecryptfs-utils-100/src/pam_ecryptfs/pam_ecryptfs.c
+--- ecryptfs-utils-100/src/pam_ecryptfs/pam_ecryptfs.c.pamdata 2012-09-27 15:00:56.127148058 +0200
++++ ecryptfs-utils-100/src/pam_ecryptfs/pam_ecryptfs.c 2012-09-27 15:03:45.105625179 +0200
@@ -47,6 +47,26 @@
#define PRIVATE_DIR "Private"
@@ -37,7 +37,7 @@ diff -up ecryptfs-utils-99/src/pam_ecryptfs/pam_ecryptfs.c.pamdata ecryptfs-util
{
char *unwrapped_pw_filename = NULL;
struct stat s;
-@@ -98,51 +118,37 @@ static int wrap_passphrase_if_necessary(
+@@ -96,138 +116,66 @@ static int wrap_passphrase_if_necessary(
PAM_EXTERN int pam_sm_authenticate(pam_handle_t *pamh, int flags, int argc,
const char **argv)
{
@@ -54,10 +54,10 @@ diff -up ecryptfs-utils-99/src/pam_ecryptfs/pam_ecryptfs.c.pamdata ecryptfs-util
char *private_mnt = NULL;
- pid_t child_pid, tmp_pid;
long rc;
-+ struct ecryptfs_pam_data *epd = {0,};
++ struct ecryptfs_pam_data *epd;
- rc = pam_get_user(pamh, &username, NULL);
-+ if ((epd = malloc(sizeof(struct ecryptfs_pam_data))) == NULL) {
++ if ((epd = calloc(1, sizeof(struct ecryptfs_pam_data))) == NULL) {
+ syslog(LOG_ERR,"Memory allocation failed");
+ rc = -ENOMEM;
+ goto out;
@@ -68,19 +68,22 @@ diff -up ecryptfs-utils-99/src/pam_ecryptfs/pam_ecryptfs.c.pamdata ecryptfs-util
struct passwd *pwd;
- pwd = getpwnam(username);
++ errno = 0;
+ pwd = getpwnam(epd->username);
if (pwd) {
- uid = pwd->pw_uid;
- gid = pwd->pw_gid;
- homedir = pwd->pw_dir;
+- }
+- } else {
+- syslog(LOG_ERR, "pam_ecryptfs: Error getting passwd info for user [%s]; rc = [%ld]\n", username, rc);
+- goto out;
+ epd->uid = pwd->pw_uid;
+ epd->gid = pwd->pw_gid;
+ epd->homedir = pwd->pw_dir;
- }
- } else {
-- syslog(LOG_ERR, "pam_ecryptfs: Error getting passwd info for user [%s]; rc = [%ld]\n", username, rc);
-- goto out;
-- }
++ rc = 0;
++ } else rc = errno;
+ }
-
- if ((oeuid = geteuid()) < 0 || (oegid = getegid()) < 0 ||
- (ngids = getgroups(sizeof(groups)/sizeof(gid_t), groups)) < 0) {
@@ -90,6 +93,7 @@ diff -up ecryptfs-utils-99/src/pam_ecryptfs/pam_ecryptfs.c.pamdata ecryptfs-util
-
- if (setegid(gid) < 0 || setgroups(1, &gid) < 0 || seteuid(uid) < 0) {
- syslog(LOG_ERR, "pam_ecryptfs: seteuid error");
++ if (!epd->homedir) {
+ syslog(LOG_ERR, "pam_ecryptfs: Error getting passwd info for user; rc = [%ld]\n", rc);
goto out;
}
@@ -105,9 +109,6 @@ diff -up ecryptfs-utils-99/src/pam_ecryptfs/pam_ecryptfs.c.pamdata ecryptfs-util
/* If private/home is already mounted, then we can skip
costly loading of keys */
goto out;
-@@ -152,89 +158,28 @@ PAM_EXTERN int pam_sm_authenticate(pam_h
- costly loading of keys */
- goto out;
}
- if(file_exists_dotecryptfs(homedir, "wrapping-independent") == 1)
- rc = pam_prompt(pamh, PAM_PROMPT_ECHO_OFF, &passphrase, "Encryption passphrase: ");
@@ -196,17 +197,17 @@ diff -up ecryptfs-utils-99/src/pam_ecryptfs/pam_ecryptfs.c.pamdata ecryptfs-util
- if (tmp_pid == -1)
- syslog(LOG_WARNING, "pam_ecryptfs: waitpid() returned with error condition\n");
-out:
-
+-
- seteuid(oeuid);
- setegid(oegid);
- setgroups(ngids, groups);
--
+
-outnouid:
+out:
if (private_mnt != NULL)
free(private_mnt);
return PAM_SUCCESS;
-@@ -381,10 +326,115 @@ static int umount_private_dir(pam_handle
+@@ -372,10 +320,119 @@ static int umount_private_dir(pam_handle
return private_dir(pamh, 0);
}
@@ -247,7 +248,11 @@ diff -up ecryptfs-utils-99/src/pam_ecryptfs/pam_ecryptfs.c.pamdata ecryptfs-util
+
+ if ((child_pid = fork()) == 0) {
+ /* temp regain uid 0 to drop privs */
-+ seteuid(oeuid);
++ if (seteuid(oeuid) < 0)
++ {
++ syslog(LOG_ERR, "pam_ecryptfs: seteuid error");
++ goto out_child;
++ }
+ /* setgroups() already called */
+ if (setgid(epd->gid) < 0 || setuid(epd->uid) < 0)
+ goto out_child;
@@ -304,9 +309,9 @@ diff -up ecryptfs-utils-99/src/pam_ecryptfs/pam_ecryptfs.c.pamdata ecryptfs-util
+ syslog(LOG_WARNING,
+ "waitpid() returned with error condition\n");
+out:
-+ seteuid(oeuid);
-+ setegid(oegid);
-+ setgroups(ngids, groups);
++ rc = seteuid(oeuid);
++ rc = setegid(oegid);
++ rc = setgroups(ngids, groups);
+
+outnouid:
+
diff --git a/ecryptfs-utils-87-syslog.patch b/ecryptfs-utils-87-syslog.patch
index 91438c6..5024953 100644
--- a/ecryptfs-utils-87-syslog.patch
+++ b/ecryptfs-utils-87-syslog.patch
@@ -1,6 +1,6 @@
-diff -up ecryptfs-utils-99/src/include/ecryptfs.h.syslog ecryptfs-utils-99/src/include/ecryptfs.h
---- ecryptfs-utils-99/src/include/ecryptfs.h.syslog 2012-07-24 13:22:22.225044430 +0200
-+++ ecryptfs-utils-99/src/include/ecryptfs.h 2012-07-24 13:22:22.228044457 +0200
+diff -up ecryptfs-utils-100/src/include/ecryptfs.h.syslog ecryptfs-utils-100/src/include/ecryptfs.h
+--- ecryptfs-utils-100/src/include/ecryptfs.h.syslog 2012-09-27 15:04:15.639901578 +0200
++++ ecryptfs-utils-100/src/include/ecryptfs.h 2012-09-27 15:04:15.659901767 +0200
@@ -143,7 +143,7 @@
#define ECRYPTFS_TAG_67_PACKET 0x43
@@ -10,9 +10,9 @@ diff -up ecryptfs-utils-99/src/include/ecryptfs.h.syslog ecryptfs-utils-99/src/i
#define ECRYPTFS_MAX_NUM_CIPHERS 64
#define ECRYPTFS_ECHO_ON 1
-diff -up ecryptfs-utils-99/src/pam_ecryptfs/pam_ecryptfs.c.syslog ecryptfs-utils-99/src/pam_ecryptfs/pam_ecryptfs.c
---- ecryptfs-utils-99/src/pam_ecryptfs/pam_ecryptfs.c.syslog 2012-07-24 13:22:22.222044403 +0200
-+++ ecryptfs-utils-99/src/pam_ecryptfs/pam_ecryptfs.c 2012-07-24 13:23:02.726405147 +0200
+diff -up ecryptfs-utils-100/src/pam_ecryptfs/pam_ecryptfs.c.syslog ecryptfs-utils-100/src/pam_ecryptfs/pam_ecryptfs.c
+--- ecryptfs-utils-100/src/pam_ecryptfs/pam_ecryptfs.c.syslog 2012-09-27 15:04:15.626901456 +0200
++++ ecryptfs-utils-100/src/pam_ecryptfs/pam_ecryptfs.c 2012-09-27 15:04:59.003302383 +0200
@@ -94,7 +94,7 @@ static int wrap_passphrase_if_necessary(
rc = asprintf(&unwrapped_pw_filename, "/dev/shm/.ecryptfs-%s", username);
@@ -22,28 +22,28 @@ diff -up ecryptfs-utils-99/src/pam_ecryptfs/pam_ecryptfs.c.syslog ecryptfs-utils
return -ENOMEM;
}
/* If /dev/shm/.ecryptfs-$USER exists and owned by the user
-@@ -108,7 +108,7 @@ static int wrap_passphrase_if_necessary(
- setuid(uid);
- rc = ecryptfs_wrap_passphrase_file(wrapped_pw_filename, passphrase, salt, unwrapped_pw_filename);
- if (rc != 0) {
+@@ -106,7 +106,7 @@ static int wrap_passphrase_if_necessary(
+ passphrase != NULL && *passphrase != '\0' &&
+ username != NULL && *username != '\0') {
+ if ((rc = setuid(uid))<0 || ((rc = ecryptfs_wrap_passphrase_file(wrapped_pw_filename, passphrase, salt, unwrapped_pw_filename)) != 0)) {
- syslog(LOG_ERR, "pam_ecryptfs: Error wrapping cleartext password; " "rc = [%d]\n", rc);
+ ecryptfs_syslog(LOG_ERR, "pam_ecryptfs: Error wrapping cleartext password; " "rc = [%d]\n", rc);
}
return rc;
}
-@@ -125,7 +125,7 @@ PAM_EXTERN int pam_sm_authenticate(pam_h
- struct ecryptfs_pam_data *epd = {0,};
+@@ -122,7 +122,7 @@ PAM_EXTERN int pam_sm_authenticate(pam_h
+ struct ecryptfs_pam_data *epd;
- if ((epd = malloc(sizeof(struct ecryptfs_pam_data))) == NULL) {
+ if ((epd = calloc(1, sizeof(struct ecryptfs_pam_data))) == NULL) {
- syslog(LOG_ERR,"Memory allocation failed");
+ ecryptfs_syslog(LOG_ERR,"Memory allocation failed");
rc = -ENOMEM;
goto out;
}
@@ -141,7 +141,7 @@ PAM_EXTERN int pam_sm_authenticate(pam_h
- epd->homedir = pwd->pw_dir;
- }
- } else {
+ } else rc = errno;
+ }
+ if (!epd->homedir) {
- syslog(LOG_ERR, "pam_ecryptfs: Error getting passwd info for user; rc = [%ld]\n", rc);
+ ecryptfs_syslog(LOG_ERR, "pam_ecryptfs: Error getting passwd info for user; rc = [%ld]\n", rc);
goto out;
@@ -58,7 +58,7 @@ diff -up ecryptfs-utils-99/src/pam_ecryptfs/pam_ecryptfs.c.syslog ecryptfs-utils
/* If private/home is already mounted, then we can skip
costly loading of keys */
goto out;
-@@ -164,7 +164,7 @@ PAM_EXTERN int pam_sm_authenticate(pam_h
+@@ -160,7 +160,7 @@ PAM_EXTERN int pam_sm_authenticate(pam_h
rc = pam_get_item(pamh, PAM_AUTHTOK, (const void **)&epd->passphrase);
epd->passphrase = strdup(epd->passphrase);
if (rc != PAM_SUCCESS) {
@@ -67,7 +67,7 @@ diff -up ecryptfs-utils-99/src/pam_ecryptfs/pam_ecryptfs.c.syslog ecryptfs-utils
rc);
goto out;
}
-@@ -175,7 +175,7 @@ PAM_EXTERN int pam_sm_authenticate(pam_h
+@@ -171,7 +171,7 @@ PAM_EXTERN int pam_sm_authenticate(pam_h
from_hex(epd->salt, salt_hex, ECRYPTFS_SALT_SIZE);
epd->unwrap = ((argc == 1) && (memcmp(argv[0], "unwrap\0", 7) == 0));
if ((rc=pam_set_data(pamh, ECRYPTFS_PAM_DATA, epd, pam_free_ecryptfsdata)) != PAM_SUCCESS) {
@@ -76,7 +76,7 @@ diff -up ecryptfs-utils-99/src/pam_ecryptfs/pam_ecryptfs.c.syslog ecryptfs-utils
goto out;
}
-@@ -199,12 +199,12 @@ static struct passwd *fetch_pwd(pam_hand
+@@ -195,12 +195,12 @@ static struct passwd *fetch_pwd(pam_hand
rc = pam_get_user(pamh, &username, NULL);
if (rc != PAM_SUCCESS || username == NULL) {
@@ -91,7 +91,7 @@ diff -up ecryptfs-utils-99/src/pam_ecryptfs/pam_ecryptfs.c.syslog ecryptfs-utils
return NULL;
}
return pwd;
-@@ -235,13 +235,13 @@ static int private_dir(pam_handle_t *pam
+@@ -231,13 +231,13 @@ static int private_dir(pam_handle_t *pam
if (
(asprintf(&autofile, "%s/.ecryptfs/%s", pwd->pw_dir, a) < 0)
|| autofile == NULL) {
@@ -107,7 +107,7 @@ diff -up ecryptfs-utils-99/src/pam_ecryptfs/pam_ecryptfs.c.syslog ecryptfs-utils
return 1;
}
if (stat(sigfile, &s) != 0) {
-@@ -253,7 +253,7 @@ static int private_dir(pam_handle_t *pam
+@@ -249,7 +249,7 @@ static int private_dir(pam_handle_t *pam
goto out;
}
if ((pid = fork()) < 0) {
@@ -116,7 +116,7 @@ diff -up ecryptfs-utils-99/src/pam_ecryptfs/pam_ecryptfs.c.syslog ecryptfs-utils
return 1;
}
if (pid == 0) {
-@@ -261,7 +261,7 @@ static int private_dir(pam_handle_t *pam
+@@ -257,7 +257,7 @@ static int private_dir(pam_handle_t *pam
if ((asprintf(&recorded,
"%s/.ecryptfs/.wrapped-passphrase.recorded",
pwd->pw_dir) < 0) || recorded == NULL) {
@@ -125,7 +125,7 @@ diff -up ecryptfs-utils-99/src/pam_ecryptfs/pam_ecryptfs.c.syslog ecryptfs-utils
_exit(255);
}
if (stat(recorded, &s) != 0 && stat("/usr/share/ecryptfs-utils/ecryptfs-record-passphrase", &s) == 0) {
-@@ -273,12 +273,12 @@ static int private_dir(pam_handle_t *pam
+@@ -269,12 +269,12 @@ static int private_dir(pam_handle_t *pam
}
if (stat(autofile, &s) != 0) {
/* User does not want to auto-mount */
@@ -140,7 +140,7 @@ diff -up ecryptfs-utils-99/src/pam_ecryptfs/pam_ecryptfs.c.syslog ecryptfs-utils
_exit(255);
}
/* run mount.ecryptfs_private as the user */
-@@ -286,16 +286,16 @@ static int private_dir(pam_handle_t *pam
+@@ -282,16 +282,16 @@ static int private_dir(pam_handle_t *pam
_exit(255);
execl("/sbin/mount.ecryptfs_private",
"mount.ecryptfs_private", NULL);
@@ -160,7 +160,7 @@ diff -up ecryptfs-utils-99/src/pam_ecryptfs/pam_ecryptfs.c.syslog ecryptfs-utils
_exit(255);
}
/* run umount.ecryptfs_private as the user */
-@@ -303,7 +303,7 @@ static int private_dir(pam_handle_t *pam
+@@ -299,7 +299,7 @@ static int private_dir(pam_handle_t *pam
_exit(255);
execl("/sbin/umount.ecryptfs_private",
"umount.ecryptfs_private", NULL);
@@ -169,7 +169,7 @@ diff -up ecryptfs-utils-99/src/pam_ecryptfs/pam_ecryptfs.c.syslog ecryptfs-utils
_exit(255);
}
_exit(255);
-@@ -338,24 +338,24 @@ static int fill_keyring(pam_handle_t *pa
+@@ -334,24 +334,24 @@ static int fill_keyring(pam_handle_t *pa
if ((rc=pam_get_data(pamh, ECRYPTFS_PAM_DATA, (const void **)&epd)) != PAM_SUCCESS)
{
@@ -245,7 +245,7 @@ diff -up ecryptfs-utils-99/src/pam_ecryptfs/pam_ecryptfs.c.syslog ecryptfs-utils
+ ecryptfs_syslog(LOG_WARNING,
"waitpid() returned with error condition\n");
out:
- seteuid(oeuid);
+ rc = seteuid(oeuid);
@@ -473,33 +473,33 @@ PAM_EXTERN int pam_sm_chauthtok(pam_hand
homedir = pwd->pw_dir;
}
@@ -317,7 +317,7 @@ diff -up ecryptfs-utils-99/src/pam_ecryptfs/pam_ecryptfs.c.syslog ecryptfs-utils
rc = PAM_AUTHTOK_RECOVER_ERR;
goto out;
}
-@@ -546,20 +546,20 @@ PAM_EXTERN int pam_sm_chauthtok(pam_hand
+@@ -549,20 +549,20 @@ PAM_EXTERN int pam_sm_chauthtok(pam_hand
if ((rc = ecryptfs_unwrap_passphrase(passphrase,
wrapped_pw_filename,
old_passphrase, salt))) {
diff --git a/ecryptfs-utils.spec b/ecryptfs-utils.spec
index e204b87..3489c3a 100644
--- a/ecryptfs-utils.spec
+++ b/ecryptfs-utils.spec
@@ -5,7 +5,7 @@
Name: ecryptfs-utils
Version: 100
-Release: 1%{?dist}
+Release: 2%{?dist}
Summary: The eCryptfs mount helper and support libraries
Group: System Environment/Base
License: GPLv2+
@@ -252,6 +252,13 @@ rm -rf $RPM_BUILD_ROOT
%{python_sitearch}/ecryptfs-utils/_libecryptfs.so
%changelog
+* Thu Sep 27 2012 Michal Hlavinka <mhlavink at redhat.com> - 100-2
+- do not crash in pam module when non-existent user name is used (#859766)
+- fix Werror messages in new build environment
+
+* Mon Aug 20 2012 Michal Hlavinka <mhlavink at redhat.com> - 100-2
+- fix Werror messages in new build environment
+
* Fri Aug 03 2012 Michal Hlavinka <mhlavink at redhat.com> - 100-1
- ecryptfs-utils updated to 100
More information about the scm-commits
mailing list