stable.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
To: linux-kernel@vger.kernel.org
Cc: Greg Kroah-Hartman <gregkh@linuxfoundation.org>,
	stable@vger.kernel.org, Sergei Antonov <saproj@gmail.com>,
	Joe Perches <joe@perches.com>,
	Vyacheslav Dubeyko <slava@dubeyko.com>,
	Hin-Tak Leung <htl10@users.sourceforge.net>,
	Anton Altaparmakov <aia21@cam.ac.uk>,
	Al Viro <viro@zeniv.linux.org.uk>,
	Christoph Hellwig <hch@infradead.org>,
	Andrew Morton <akpm@linux-foundation.org>,
	Linus Torvalds <torvalds@linux-foundation.org>
Subject: [PATCH 3.14 32/38] hfsplus: fix B-tree corruption after insertion at position 0
Date: Fri, 10 Apr 2015 15:19:20 +0200	[thread overview]
Message-ID: <20150410131704.060675133@linuxfoundation.org> (raw)
In-Reply-To: <20150410131701.236830106@linuxfoundation.org>

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

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

From: Sergei Antonov <saproj@gmail.com>

commit 98cf21c61a7f5419d82f847c4d77bf6e96a76f5f upstream.

Fix B-tree corruption when a new record is inserted at position 0 in the
node in hfs_brec_insert().  In this case a hfs_brec_update_parent() is
called to update the parent index node (if exists) and it is passed
hfs_find_data with a search_key containing a newly inserted key instead
of the key to be updated.  This results in an inconsistent index node.
The bug reproduces on my machine after an extents overflow record for
the catalog file (CNID=4) is inserted into the extents overflow B-tree.
Because of a low (reserved) value of CNID=4, it has to become the first
record in the first leaf node.

The resulting first leaf node is correct:

  ----------------------------------------------------
  | key0.CNID=4 | key1.CNID=123 | key2.CNID=456, ... |
  ----------------------------------------------------

But the parent index key0 still contains the previous key CNID=123:

  -----------------------
  | key0.CNID=123 | ... |
  -----------------------

A change in hfs_brec_insert() makes hfs_brec_update_parent() work
correctly by preventing it from getting fd->record=-1 value from
__hfs_brec_find().

Along the way, I removed duplicate code with unification of the if
condition.  The resulting code is equivalent to the original code
because node is never 0.

Also hfs_brec_update_parent() will now return an error after getting a
negative fd->record value.  However, the return value of
hfs_brec_update_parent() is not checked anywhere in the file and I'm
leaving it unchanged by this patch.  brec.c lacks error checking after
some other calls too, but this issue is of less importance than the one
being fixed by this patch.

Signed-off-by: Sergei Antonov <saproj@gmail.com>
Cc: Joe Perches <joe@perches.com>
Reviewed-by: Vyacheslav Dubeyko <slava@dubeyko.com>
Acked-by: Hin-Tak Leung <htl10@users.sourceforge.net>
Cc: Anton Altaparmakov <aia21@cam.ac.uk>
Cc: Al Viro <viro@zeniv.linux.org.uk>
Cc: Christoph Hellwig <hch@infradead.org>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

---
 fs/hfsplus/brec.c |   20 +++++++++++---------
 1 file changed, 11 insertions(+), 9 deletions(-)

--- a/fs/hfsplus/brec.c
+++ b/fs/hfsplus/brec.c
@@ -131,13 +131,16 @@ skip:
 	hfs_bnode_write(node, entry, data_off + key_len, entry_len);
 	hfs_bnode_dump(node);
 
-	if (new_node) {
-		/* update parent key if we inserted a key
-		 * at the start of the first node
-		 */
-		if (!rec && new_node != node)
-			hfs_brec_update_parent(fd);
+	/*
+	 * update parent key if we inserted a key
+	 * at the start of the node and it is not the new node
+	 */
+	if (!rec && new_node != node) {
+		hfs_bnode_read_key(node, fd->search_key, data_off + size);
+		hfs_brec_update_parent(fd);
+	}
 
+	if (new_node) {
 		hfs_bnode_put(fd->bnode);
 		if (!new_node->parent) {
 			hfs_btree_inc_height(tree);
@@ -168,9 +171,6 @@ skip:
 		goto again;
 	}
 
-	if (!rec)
-		hfs_brec_update_parent(fd);
-
 	return 0;
 }
 
@@ -370,6 +370,8 @@ again:
 	if (IS_ERR(parent))
 		return PTR_ERR(parent);
 	__hfs_brec_find(parent, fd, hfs_find_rec_by_key);
+	if (fd->record < 0)
+		return -ENOENT;
 	hfs_bnode_dump(parent);
 	rec = fd->record;
 



  parent reply	other threads:[~2015-04-10 13:19 UTC|newest]

Thread overview: 38+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2015-04-10 13:18 [PATCH 3.14 00/38] 3.14.38-stable review Greg Kroah-Hartman
2015-04-10 13:18 ` [PATCH 3.14 01/38] ASoC: sgtl5000: remove useless register write clearing CHRGPUMP_POWERUP Greg Kroah-Hartman
2015-04-10 13:18 ` [PATCH 3.14 02/38] ASoC: pcm1681: Fix wrong value references for boolean kctl Greg Kroah-Hartman
2015-04-10 13:18 ` [PATCH 3.14 03/38] ASoC: cs4271: " Greg Kroah-Hartman
2015-04-10 13:18 ` [PATCH 3.14 04/38] ASoC: wm8960: " Greg Kroah-Hartman
2015-04-10 13:18 ` [PATCH 3.14 05/38] ASoC: tas5086: " Greg Kroah-Hartman
2015-04-10 13:18 ` [PATCH 3.14 06/38] ASoC: wm8731: " Greg Kroah-Hartman
2015-04-10 13:18 ` [PATCH 3.14 07/38] ASoC: wm2000: " Greg Kroah-Hartman
2015-04-10 13:18 ` [PATCH 3.14 08/38] ASoC: wm8903: " Greg Kroah-Hartman
2015-04-10 13:18 ` [PATCH 3.14 09/38] ASoC: wm8904: " Greg Kroah-Hartman
2015-04-10 13:18 ` [PATCH 3.14 10/38] ASoC: ak4641: " Greg Kroah-Hartman
2015-04-10 13:18 ` [PATCH 3.14 11/38] ASoC: adav80x: " Greg Kroah-Hartman
2015-04-10 13:19 ` [PATCH 3.14 12/38] ASoC: wm8955: " Greg Kroah-Hartman
2015-04-10 13:19 ` [PATCH 3.14 13/38] ASoC: jz4740: Remove Makefile entry for removed file Greg Kroah-Hartman
2015-04-10 13:19 ` [PATCH 3.14 14/38] clockevents: sun5i: Fix setup_irq init sequence Greg Kroah-Hartman
2015-04-10 13:19 ` [PATCH 3.14 15/38] regmap: regcache-rbtree: Fix present bitmap resize Greg Kroah-Hartman
2015-04-10 13:19 ` [PATCH 3.14 17/38] tcm_fc: missing curly braces in ft_invl_hw_context() Greg Kroah-Hartman
2015-04-10 13:19 ` [PATCH 3.14 18/38] tcm_qla2xxx: Fix incorrect use of __transport_register_session Greg Kroah-Hartman
2015-04-10 13:19 ` [PATCH 3.14 19/38] nl80211: ignore HT/VHT capabilities without QoS/WMM Greg Kroah-Hartman
2015-04-10 13:19 ` [PATCH 3.14 20/38] mac80211: disable u-APSD queues by default Greg Kroah-Hartman
2015-04-10 13:19 ` [PATCH 3.14 21/38] mac80211: drop unencrypted frames in mesh fwding Greg Kroah-Hartman
2015-04-10 13:19 ` [PATCH 3.14 22/38] Revert "iwlwifi: mvm: fix failure path when power_update fails in add_interface" Greg Kroah-Hartman
2015-04-10 13:19 ` [PATCH 3.14 23/38] phy: Find the right match in devm_phy_destroy() Greg Kroah-Hartman
2015-04-10 13:19 ` [PATCH 3.14 24/38] of/irq: Fix of_irq_parse_one() returned error codes Greg Kroah-Hartman
2015-04-10 13:19 ` [PATCH 3.14 25/38] perf: Fix irq_work tail recursion Greg Kroah-Hartman
2015-04-10 13:19 ` [PATCH 3.14 26/38] staging: vt6656: vnt_rf_setpower: fix missing rate RATE_12M Greg Kroah-Hartman
2015-04-10 13:19 ` [PATCH 3.14 27/38] vt6655: RFbSetPower " Greg Kroah-Hartman
2015-04-10 13:19 ` [PATCH 3.14 28/38] dmaengine: dw: append MODULE_ALIAS for platform driver Greg Kroah-Hartman
2015-04-10 13:19 ` [PATCH 3.14 29/38] dm: hold suspend_lock while suspending device during device deletion Greg Kroah-Hartman
2015-04-10 13:19 ` [PATCH 3.14 30/38] dm io: deal with wandering queue limits when handling REQ_DISCARD and REQ_WRITE_SAME Greg Kroah-Hartman
2015-04-10 13:19 ` Greg Kroah-Hartman [this message]
2015-04-10 13:19 ` [PATCH 3.14 33/38] powerpc/book3s: Fix the MCE code to use CONFIG_KVM_BOOK3S_64_HANDLER Greg Kroah-Hartman
2015-04-10 13:19 ` [PATCH 3.14 34/38] arm64: Use the reserved TTBR0 if context switching to the init_mm Greg Kroah-Hartman
2015-04-10 13:19 ` [PATCH 3.14 35/38] powerpc/pseries: Little endian fixes for post mobility device tree update Greg Kroah-Hartman
2015-04-10 13:19 ` [PATCH 3.14 36/38] powerpc/mpc85xx: Add ranges to etsec2 nodes Greg Kroah-Hartman
2015-04-10 13:19 ` [PATCH 3.14 37/38] net: ethernet: pcnet32: Setup the SRAM and NOUFLO on Am79C97{3, 5} Greg Kroah-Hartman
2015-04-10 13:19 ` [PATCH 3.14 38/38] mfd: kempld-core: Fix callback return value check Greg Kroah-Hartman
2015-04-10 18:04 ` [PATCH 3.14 00/38] 3.14.38-stable review Guenter Roeck

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=20150410131704.060675133@linuxfoundation.org \
    --to=gregkh@linuxfoundation.org \
    --cc=aia21@cam.ac.uk \
    --cc=akpm@linux-foundation.org \
    --cc=hch@infradead.org \
    --cc=htl10@users.sourceforge.net \
    --cc=joe@perches.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=saproj@gmail.com \
    --cc=slava@dubeyko.com \
    --cc=stable@vger.kernel.org \
    --cc=torvalds@linux-foundation.org \
    --cc=viro@zeniv.linux.org.uk \
    /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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).