All of lore.kernel.org
 help / color / mirror / Atom feed
From: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
To: linux-kernel@vger.kernel.org, stable@vger.kernel.org
Cc: Greg Kroah-Hartman <gregkh@linuxfoundation.org>,
	alan@lxorguk.ukuu.org.uk, Tyler Hicks <tyhicks@canonical.com>,
	John Johansen <john.johansen@canonical.com>,
	Colin Ian King <colin.king@canonical.com>,
	Jonathan Nieder <jrnieder@gmail.com>
Subject: [ 51/62] eCryptfs: Initialize empty lower files when opening them
Date: Thu, 18 Oct 2012 19:45:19 -0700	[thread overview]
Message-ID: <20121019024304.202852533@linuxfoundation.org> (raw)
In-Reply-To: <20121019024255.944999470@linuxfoundation.org>

3.4-stable review patch.  If anyone has any objections, please let me know.

------------------

From: Tyler Hicks <tyhicks@canonical.com>

commit e3ccaa9761200952cc269b1f4b7d7bb77a5e071b upstream.

Historically, eCryptfs has only initialized lower files in the
ecryptfs_create() path. Lower file initialization is the act of writing
the cryptographic metadata from the inode's crypt_stat to the header of
the file. The ecryptfs_open() path already expects that metadata to be
in the header of the file.

A number of users have reported empty lower files in beneath their
eCryptfs mounts. Most of the causes for those empty files being left
around have been addressed, but the presence of empty files causes
problems due to the lack of proper cryptographic metadata.

To transparently solve this problem, this patch initializes empty lower
files in the ecryptfs_open() error path. If the metadata is unreadable
due to the lower inode size being 0, plaintext passthrough support is
not in use, and the metadata is stored in the header of the file (as
opposed to the user.ecryptfs extended attribute), the lower file will be
initialized.

The number of nested conditionals in ecryptfs_open() was getting out of
hand, so a helper function was created. To avoid the same nested
conditional problem, the conditional logic was reversed inside of the
helper function.

https://launchpad.net/bugs/911507

Signed-off-by: Tyler Hicks <tyhicks@canonical.com>
Cc: John Johansen <john.johansen@canonical.com>
Cc: Colin Ian King <colin.king@canonical.com>
Cc: Jonathan Nieder <jrnieder@gmail.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

---
 fs/ecryptfs/ecryptfs_kernel.h |    2 +
 fs/ecryptfs/file.c            |   71 ++++++++++++++++++++++++++----------------
 fs/ecryptfs/inode.c           |    4 +-
 3 files changed, 49 insertions(+), 28 deletions(-)

--- a/fs/ecryptfs/ecryptfs_kernel.h
+++ b/fs/ecryptfs/ecryptfs_kernel.h
@@ -568,6 +568,8 @@ struct ecryptfs_open_req {
 struct inode *ecryptfs_get_inode(struct inode *lower_inode,
 				 struct super_block *sb);
 void ecryptfs_i_size_init(const char *page_virt, struct inode *inode);
+int ecryptfs_initialize_file(struct dentry *ecryptfs_dentry,
+			     struct inode *ecryptfs_inode);
 int ecryptfs_decode_and_decrypt_filename(char **decrypted_name,
 					 size_t *decrypted_name_size,
 					 struct dentry *ecryptfs_dentry,
--- a/fs/ecryptfs/file.c
+++ b/fs/ecryptfs/file.c
@@ -161,6 +161,48 @@ static int ecryptfs_file_mmap(struct fil
 
 struct kmem_cache *ecryptfs_file_info_cache;
 
+static int read_or_initialize_metadata(struct dentry *dentry)
+{
+	struct inode *inode = dentry->d_inode;
+	struct ecryptfs_mount_crypt_stat *mount_crypt_stat;
+	struct ecryptfs_crypt_stat *crypt_stat;
+	int rc;
+
+	crypt_stat = &ecryptfs_inode_to_private(inode)->crypt_stat;
+	mount_crypt_stat = &ecryptfs_superblock_to_private(
+						inode->i_sb)->mount_crypt_stat;
+	mutex_lock(&crypt_stat->cs_mutex);
+
+	if (crypt_stat->flags & ECRYPTFS_POLICY_APPLIED &&
+	    crypt_stat->flags & ECRYPTFS_KEY_VALID) {
+		rc = 0;
+		goto out;
+	}
+
+	rc = ecryptfs_read_metadata(dentry);
+	if (!rc)
+		goto out;
+
+	if (mount_crypt_stat->flags & ECRYPTFS_PLAINTEXT_PASSTHROUGH_ENABLED) {
+		crypt_stat->flags &= ~(ECRYPTFS_I_SIZE_INITIALIZED
+				       | ECRYPTFS_ENCRYPTED);
+		rc = 0;
+		goto out;
+	}
+
+	if (!(mount_crypt_stat->flags & ECRYPTFS_XATTR_METADATA_ENABLED) &&
+	    !i_size_read(ecryptfs_inode_to_lower(inode))) {
+		rc = ecryptfs_initialize_file(dentry, inode);
+		if (!rc)
+			goto out;
+	}
+
+	rc = -EIO;
+out:
+	mutex_unlock(&crypt_stat->cs_mutex);
+	return rc;
+}
+
 /**
  * ecryptfs_open
  * @inode: inode speciying file to open
@@ -236,32 +278,9 @@ static int ecryptfs_open(struct inode *i
 		rc = 0;
 		goto out;
 	}
-	mutex_lock(&crypt_stat->cs_mutex);
-	if (!(crypt_stat->flags & ECRYPTFS_POLICY_APPLIED)
-	    || !(crypt_stat->flags & ECRYPTFS_KEY_VALID)) {
-		rc = ecryptfs_read_metadata(ecryptfs_dentry);
-		if (rc) {
-			ecryptfs_printk(KERN_DEBUG,
-					"Valid headers not found\n");
-			if (!(mount_crypt_stat->flags
-			      & ECRYPTFS_PLAINTEXT_PASSTHROUGH_ENABLED)) {
-				rc = -EIO;
-				printk(KERN_WARNING "Either the lower file "
-				       "is not in a valid eCryptfs format, "
-				       "or the key could not be retrieved. "
-				       "Plaintext passthrough mode is not "
-				       "enabled; returning -EIO\n");
-				mutex_unlock(&crypt_stat->cs_mutex);
-				goto out_put;
-			}
-			rc = 0;
-			crypt_stat->flags &= ~(ECRYPTFS_I_SIZE_INITIALIZED
-					       | ECRYPTFS_ENCRYPTED);
-			mutex_unlock(&crypt_stat->cs_mutex);
-			goto out;
-		}
-	}
-	mutex_unlock(&crypt_stat->cs_mutex);
+	rc = read_or_initialize_metadata(ecryptfs_dentry);
+	if (rc)
+		goto out_put;
 	ecryptfs_printk(KERN_DEBUG, "inode w/ addr = [0x%p], i_ino = "
 			"[0x%.16lx] size: [0x%.16llx]\n", inode, inode->i_ino,
 			(unsigned long long)i_size_read(inode));
--- a/fs/ecryptfs/inode.c
+++ b/fs/ecryptfs/inode.c
@@ -227,8 +227,8 @@ out:
  *
  * Returns zero on success
  */
-static int ecryptfs_initialize_file(struct dentry *ecryptfs_dentry,
-				    struct inode *ecryptfs_inode)
+int ecryptfs_initialize_file(struct dentry *ecryptfs_dentry,
+			     struct inode *ecryptfs_inode)
 {
 	struct ecryptfs_crypt_stat *crypt_stat =
 		&ecryptfs_inode_to_private(ecryptfs_inode)->crypt_stat;



  parent reply	other threads:[~2012-10-19  2:48 UTC|newest]

Thread overview: 64+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2012-10-19  2:44 [ 00/62] 3.4.15-stable review Greg Kroah-Hartman
2012-10-19  2:44 ` [ 01/62] ARM: vfp: fix saving d16-d31 vfp registers on v6+ kernels Greg Kroah-Hartman
2012-10-19  2:44 ` [ 02/62] nfsd4: fix nfs4 stateid leak Greg Kroah-Hartman
2012-10-19  2:44 ` [ 03/62] NFSD: pass null terminated buf to kstrtouint() Greg Kroah-Hartman
2012-10-19  2:44 ` [ 04/62] lockd: use rpc clients cl_nodename for id encoding Greg Kroah-Hartman
2012-10-19  2:44 ` [ 05/62] ACPI: EC: Make the GPE storm threshold a module parameter Greg Kroah-Hartman
2012-10-19  2:44 ` [ 06/62] ACPI: EC: Add a quirk for CLEVO M720T/M730T laptop Greg Kroah-Hartman
2012-10-19  2:44 ` [ 07/62] ALSA: hda - do not detect jack on internal speakers for Realtek Greg Kroah-Hartman
2012-10-19  2:44 ` [ 08/62] ALSA: hda - Fix memory leaks at error path in patch_cirrus.c Greg Kroah-Hartman
2012-10-19  2:44 ` [ 09/62] mips,kgdb: fix recursive page fault with CONFIG_KPROBES Greg Kroah-Hartman
2012-10-19  2:44 ` [ 10/62] tmpfs,ceph,gfs2,isofs,reiserfs,xfs: fix fh_len checking Greg Kroah-Hartman
2012-10-19  2:44 ` [ 11/62] SCSI: hpsa: dial down lockup detection during firmware flash Greg Kroah-Hartman
2012-10-19  2:44 ` [ 12/62] iscsi-target: Correctly set 0xffffffff field within ISCSI_OP_REJECT PDU Greg Kroah-Hartman
2012-10-19  2:44 ` [ 13/62] iscsit: remove incorrect unlock in iscsit_build_sendtargets_resp Greg Kroah-Hartman
2012-10-19  2:44 ` [ 14/62] iscsi-target: Add explicit set of cache_dynamic_acls=1 for TPG demo-mode Greg Kroah-Hartman
2012-10-19  2:44 ` [ 15/62] iscsi-target: Bump defaults for nopin_timeout + nopin_response_timeout values Greg Kroah-Hartman
2012-10-19  2:44 ` [ 16/62] SCSI: storvsc: Account for in-transit packets in the RESET path Greg Kroah-Hartman
2012-10-19  2:44 ` [ 17/62] SCSI: scsi_debug: Fix off-by-one bug when unmapping region Greg Kroah-Hartman
2012-10-19  2:44 ` [ 18/62] ARM: 7541/1: Add ARM ERRATA 775420 workaround Greg Kroah-Hartman
2012-10-19  2:44 ` [ 19/62] firewire: cdev: fix user memory corruption (i386 userland on amd64 kernel) Greg Kroah-Hartman
2012-10-19  2:44 ` [ 20/62] SUNRPC: Ensure that the TCP socket is closed when in CLOSE_WAIT Greg Kroah-Hartman
2012-10-19  2:44 ` [ 21/62] target: fix return code in target_core_init_configfs error path Greg Kroah-Hartman
2012-10-19  2:44 ` [ 22/62] xen/bootup: allow {read|write}_cr8 pvops call Greg Kroah-Hartman
2012-10-19  2:44 ` [ 23/62] xen/bootup: allow read_tscp call for Xen PV guests Greg Kroah-Hartman
2012-10-19  2:44 ` [ 24/62] block: fix request_queue->flags initialization Greg Kroah-Hartman
2012-10-19  2:44 ` [ 25/62] autofs4 - fix reset pending flag on mount fail Greg Kroah-Hartman
2012-10-19  2:44 ` [ 26/62] module: taint kernel when lve module is loaded Greg Kroah-Hartman
2012-10-19  2:44 ` [ 27/62] video/udlfb: fix line counting in fb_write Greg Kroah-Hartman
2012-10-19  2:44 ` [ 28/62] viafb: dont touch clock state on OLPC XO-1.5 Greg Kroah-Hartman
2012-10-19  2:44 ` [ 29/62] timers: Fix endless looping between cascade() and internal_add_timer() Greg Kroah-Hartman
2012-10-19  2:44 ` [ 30/62] ath9k: use ieee80211_free_txskb Greg Kroah-Hartman
2012-10-19  2:44 ` [ 31/62] md/raid10: use correct limit variable Greg Kroah-Hartman
2012-10-19  2:45 ` [ 32/62] kdb,vt_console: Fix missed data due to pager overruns Greg Kroah-Hartman
2012-10-19 21:39   ` Ben Hutchings
2012-10-19  2:45 ` [ 33/62] pktgen: fix crash when generating IPv6 packets Greg Kroah-Hartman
2012-10-19  2:45 ` [ 34/62] ipvs: fix oops in ip_vs_dst_event on rmmod Greg Kroah-Hartman
2012-10-19  2:45 ` [ 35/62] netfilter: nf_conntrack: fix racy timer handling with reliable events Greg Kroah-Hartman
2012-10-19  2:45 ` [ 36/62] netfilter: ipset: fix timeout value overflow bug Greg Kroah-Hartman
2012-10-19  2:45 ` [ 37/62] netfilter: ipset: timeout fixing bug broke SET target special timeout value Greg Kroah-Hartman
2012-10-19  2:45 ` [ 38/62] ipvs: fix oops on NAT reply in br_nf context Greg Kroah-Hartman
2012-10-19  2:45 ` [ 39/62] netfilter: nf_nat_sip: fix incorrect handling of EBUSY for RTCP expectation Greg Kroah-Hartman
2012-10-19  2:45 ` [ 40/62] netfilter: nf_nat_sip: fix via header translation with multiple parameters Greg Kroah-Hartman
2012-10-19  2:45 ` [ 41/62] netfilter: nf_ct_expect: fix possible access to uninitialized timer Greg Kroah-Hartman
2012-10-19  2:45 ` [ 42/62] netfilter: limit, hashlimit: avoid duplicated inline Greg Kroah-Hartman
2012-10-19  2:45 ` [ 43/62] netfilter: xt_limit: have r->cost != 0 case work Greg Kroah-Hartman
2012-10-19  2:45 ` [ 44/62] Add CDC-ACM support for the CX93010-2x UCMxx USB Modem Greg Kroah-Hartman
2012-10-19  2:45 ` [ 45/62] drm/radeon: Dont destroy I2C Bus Rec in radeon_ext_tmds_enc_destroy() Greg Kroah-Hartman
2012-10-19  2:45 ` [ 46/62] drm/i915: use adjusted_mode instead of mode for checking the 6bpc force flag Greg Kroah-Hartman
2012-10-19  2:45 ` [ 47/62] jbd: Fix assertion failure in commit code due to lacking transaction credits Greg Kroah-Hartman
2012-10-19  2:45 ` [ 48/62] e1000e: Change wthresh to 1 to avoid possible Tx stalls Greg Kroah-Hartman
2012-10-19  2:45 ` [ 49/62] tpm: Propagate error from tpm_transmit to fix a timeout hang Greg Kroah-Hartman
2012-10-19  2:45 ` [ 50/62] eCryptfs: Unlink lower inode when ecryptfs_create() fails Greg Kroah-Hartman
2012-10-19  2:45 ` Greg Kroah-Hartman [this message]
2012-10-19  2:45 ` [ 52/62] eCryptfs: Revert to a writethrough cache model Greg Kroah-Hartman
2012-10-19  2:45 ` [ 53/62] eCryptfs: Write out all dirty pages just before releasing the lower file Greg Kroah-Hartman
2012-10-19  2:45 ` [ 54/62] eCryptfs: Call lower ->flush() from ecryptfs_flush() Greg Kroah-Hartman
2012-10-19  2:45 ` [ 55/62] usb: gadget: at91_udc: fix dt support Greg Kroah-Hartman
2012-10-19  2:45 ` [ 56/62] ALSA: hda - Always check array bounds in alc_get_line_out_pfx Greg Kroah-Hartman
2012-10-19  2:45 ` [ 57/62] ASoC: fsi: dont reschedule DMA from an atomic context Greg Kroah-Hartman
2012-10-19  2:45 ` [ 58/62] ASoC: wm2200: Use rev A register patches on rev B Greg Kroah-Hartman
2012-10-19  2:45 ` [ 59/62] ASoC: wm2200: Fix non-inverted OUT2 mute control Greg Kroah-Hartman
2012-10-19  2:45 ` [ 60/62] ASoC: omap-abe-twl6040: Fix typo of Vibrator Greg Kroah-Hartman
2012-10-19  2:45 ` [ 61/62] ALSA: ac97 - Fix missing NULL check in snd_ac97_cvol_new() Greg Kroah-Hartman
2012-10-19  2:45 ` [ 62/62] ALSA: emu10k1: add chip details for E-mu 1010 PCIe card Greg Kroah-Hartman

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20121019024304.202852533@linuxfoundation.org \
    --to=gregkh@linuxfoundation.org \
    --cc=alan@lxorguk.ukuu.org.uk \
    --cc=colin.king@canonical.com \
    --cc=john.johansen@canonical.com \
    --cc=jrnieder@gmail.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=stable@vger.kernel.org \
    --cc=tyhicks@canonical.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.