<feed xmlns='http://www.w3.org/2005/Atom'>
<title>linux-toradex.git/fs/hfsplus/catalog.c, branch v3.4.54</title>
<subtitle>Linux kernel for Apalis and Colibri modules</subtitle>
<link rel='alternate' type='text/html' href='https://git.toradex.cn/cgit/linux-toradex.git/'/>
<entry>
<title>hfsplus: Fix potential buffer overflows</title>
<updated>2012-05-05T00:11:24+00:00</updated>
<author>
<name>Greg Kroah-Hartman</name>
<email>gregkh@linuxfoundation.org</email>
</author>
<published>2012-05-04T19:09:39+00:00</published>
<link rel='alternate' type='text/html' href='https://git.toradex.cn/cgit/linux-toradex.git/commit/?id=6f24f892871acc47b40dd594c63606a17c714f77'/>
<id>6f24f892871acc47b40dd594c63606a17c714f77</id>
<content type='text'>
Commit ec81aecb2966 ("hfs: fix a potential buffer overflow") fixed a few
potential buffer overflows in the hfs filesystem.  But as Timo Warns
pointed out, these changes also need to be made on the hfsplus
filesystem as well.

Reported-by: Timo Warns &lt;warns@pre-sense.de&gt;
Acked-by: WANG Cong &lt;amwang@redhat.com&gt;
Cc: Alexey Khoroshilov &lt;khoroshilov@ispras.ru&gt;
Cc: Miklos Szeredi &lt;mszeredi@suse.cz&gt;
Cc: Sage Weil &lt;sage@newdream.net&gt;
Cc: Eugene Teo &lt;eteo@redhat.com&gt;
Cc: Roman Zippel &lt;zippel@linux-m68k.org&gt;
Cc: Al Viro &lt;viro@zeniv.linux.org.uk&gt;
Cc: Christoph Hellwig &lt;hch@lst.de&gt;
Cc: Alexey Dobriyan &lt;adobriyan@gmail.com&gt;
Cc: Dave Anderson &lt;anderson@redhat.com&gt;
Cc: stable &lt;stable@vger.kernel.org&gt;
Cc: Andrew Morton &lt;akpm@linux-foundation.org&gt;
Signed-off-by: Greg Kroah-Hartman &lt;gregkh@linuxfoundation.org&gt;
Signed-off-by: Linus Torvalds &lt;torvalds@linux-foundation.org&gt;
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
Commit ec81aecb2966 ("hfs: fix a potential buffer overflow") fixed a few
potential buffer overflows in the hfs filesystem.  But as Timo Warns
pointed out, these changes also need to be made on the hfsplus
filesystem as well.

Reported-by: Timo Warns &lt;warns@pre-sense.de&gt;
Acked-by: WANG Cong &lt;amwang@redhat.com&gt;
Cc: Alexey Khoroshilov &lt;khoroshilov@ispras.ru&gt;
Cc: Miklos Szeredi &lt;mszeredi@suse.cz&gt;
Cc: Sage Weil &lt;sage@newdream.net&gt;
Cc: Eugene Teo &lt;eteo@redhat.com&gt;
Cc: Roman Zippel &lt;zippel@linux-m68k.org&gt;
Cc: Al Viro &lt;viro@zeniv.linux.org.uk&gt;
Cc: Christoph Hellwig &lt;hch@lst.de&gt;
Cc: Alexey Dobriyan &lt;adobriyan@gmail.com&gt;
Cc: Dave Anderson &lt;anderson@redhat.com&gt;
Cc: stable &lt;stable@vger.kernel.org&gt;
Cc: Andrew Morton &lt;akpm@linux-foundation.org&gt;
Signed-off-by: Greg Kroah-Hartman &lt;gregkh@linuxfoundation.org&gt;
Signed-off-by: Linus Torvalds &lt;torvalds@linux-foundation.org&gt;
</pre>
</div>
</content>
</entry>
<entry>
<title>hfsplus: add error checking for hfs_find_init()</title>
<updated>2011-07-07T15:45:46+00:00</updated>
<author>
<name>Alexey Khoroshilov</name>
<email>khoroshilov@ispras.ru</email>
</author>
<published>2011-07-05T22:29:59+00:00</published>
<link rel='alternate' type='text/html' href='https://git.toradex.cn/cgit/linux-toradex.git/commit/?id=5bd9d99d107c56ff7b35a29e930d85f91a07b2fd'/>
<id>5bd9d99d107c56ff7b35a29e930d85f91a07b2fd</id>
<content type='text'>
hfs_find_init() may fail with ENOMEM, but there are places, where
the returned value is not checked. The consequences can be very
unpleasant, e.g. kfree uninitialized pointer and
inappropriate mutex unlocking.

The patch adds checks for errors in hfs_find_init().

Found by Linux Driver Verification project (linuxtesting.org).

Signed-off-by: Alexey Khoroshilov &lt;khoroshilov@ispras.ru&gt;
Signed-off-by: Christoph Hellwig &lt;hch@lst.de&gt;
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
hfs_find_init() may fail with ENOMEM, but there are places, where
the returned value is not checked. The consequences can be very
unpleasant, e.g. kfree uninitialized pointer and
inappropriate mutex unlocking.

The patch adds checks for errors in hfs_find_init().

Found by Linux Driver Verification project (linuxtesting.org).

Signed-off-by: Alexey Khoroshilov &lt;khoroshilov@ispras.ru&gt;
Signed-off-by: Christoph Hellwig &lt;hch@lst.de&gt;
</pre>
</div>
</content>
</entry>
<entry>
<title>hfsplus: over 80 character lines clean-up</title>
<updated>2010-12-16T17:08:45+00:00</updated>
<author>
<name>Anton Salikhmetov</name>
<email>alexo@tuxera.com</email>
</author>
<published>2010-12-16T16:08:38+00:00</published>
<link rel='alternate' type='text/html' href='https://git.toradex.cn/cgit/linux-toradex.git/commit/?id=2753cc281c9a0e8a0a45ee2b8110866a9fe63bdd'/>
<id>2753cc281c9a0e8a0a45ee2b8110866a9fe63bdd</id>
<content type='text'>
Match coding style line length limitation where checkpatch.pl
reported over-80-character-line warnings.

Signed-off-by: Anton Salikhmetov &lt;alexo@tuxera.com&gt;
Signed-off-by: Christoph Hellwig &lt;hch@tuxera.com&gt;
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
Match coding style line length limitation where checkpatch.pl
reported over-80-character-line warnings.

Signed-off-by: Anton Salikhmetov &lt;alexo@tuxera.com&gt;
Signed-off-by: Christoph Hellwig &lt;hch@tuxera.com&gt;
</pre>
</div>
</content>
</entry>
<entry>
<title>hfsplus: optimize fsync</title>
<updated>2010-11-23T13:38:15+00:00</updated>
<author>
<name>Christoph Hellwig</name>
<email>hch@tuxera.com</email>
</author>
<published>2010-11-23T13:38:15+00:00</published>
<link rel='alternate' type='text/html' href='https://git.toradex.cn/cgit/linux-toradex.git/commit/?id=e34947056076ca5467ee8256d2d9cbc594a79b37'/>
<id>e34947056076ca5467ee8256d2d9cbc594a79b37</id>
<content type='text'>
Avoid doing unessecary work in fsync.  Do nothing unless the inode
was marked dirty, and only write the various metadata inodes out if
they contain any dirty state from this inode.  This is archived by
adding three new dirty bits to the hfsplus-specific inode which are
set in the correct places.

Signed-off-by: Christoph Hellwig &lt;hch@tuxera.com&gt;
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
Avoid doing unessecary work in fsync.  Do nothing unless the inode
was marked dirty, and only write the various metadata inodes out if
they contain any dirty state from this inode.  This is archived by
adding three new dirty bits to the hfsplus-specific inode which are
set in the correct places.

Signed-off-by: Christoph Hellwig &lt;hch@tuxera.com&gt;
</pre>
</div>
</content>
</entry>
<entry>
<title>hfsplus: create correct initial catalog entries for device files</title>
<updated>2010-10-14T13:54:39+00:00</updated>
<author>
<name>Christoph Hellwig</name>
<email>hch@tuxera.com</email>
</author>
<published>2010-10-14T13:54:39+00:00</published>
<link rel='alternate' type='text/html' href='https://git.toradex.cn/cgit/linux-toradex.git/commit/?id=90e616905a423126805186cb5754e10a704b30c8'/>
<id>90e616905a423126805186cb5754e10a704b30c8</id>
<content type='text'>
Make sure the initial insertation of the catalog entry already contains
the device number by calling init_special_inode early and setting writing
out the dev field of the on-disk permission structure.  The latter is
facilitated by sharing the almost identical hfsplus_set_perms helpers
between initial catalog entry creating and -&gt;write_inode.

Unless we crashed just after mknod this bug was harmless as the inode
is marked dirty at the end of hfsplus_mknod, and hfsplus_write_inode
will update the catalog entry to contain the correct value.

Signed-off-by: Christoph Hellwig &lt;hch@tuxera.com&gt;
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
Make sure the initial insertation of the catalog entry already contains
the device number by calling init_special_inode early and setting writing
out the dev field of the on-disk permission structure.  The latter is
facilitated by sharing the almost identical hfsplus_set_perms helpers
between initial catalog entry creating and -&gt;write_inode.

Unless we crashed just after mknod this bug was harmless as the inode
is marked dirty at the end of hfsplus_mknod, and hfsplus_write_inode
will update the catalog entry to contain the correct value.

Signed-off-by: Christoph Hellwig &lt;hch@tuxera.com&gt;
</pre>
</div>
</content>
</entry>
<entry>
<title>hfsplus: remove superflous rootflags field in hfsplus_inode_info</title>
<updated>2010-10-14T13:54:33+00:00</updated>
<author>
<name>Christoph Hellwig</name>
<email>hch@tuxera.com</email>
</author>
<published>2010-10-14T13:54:33+00:00</published>
<link rel='alternate' type='text/html' href='https://git.toradex.cn/cgit/linux-toradex.git/commit/?id=722c55d13e7296cc62ed8a38f926a915ff32e4ea'/>
<id>722c55d13e7296cc62ed8a38f926a915ff32e4ea</id>
<content type='text'>
The rootflags field in hfsplus_inode_info only caches the immutable and
append-only flags in the VFS inode, so we can easily get rid of it.

Signed-off-by: Christoph Hellwig &lt;hch@tuxera.com&gt;
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
The rootflags field in hfsplus_inode_info only caches the immutable and
append-only flags in the VFS inode, so we can easily get rid of it.

Signed-off-by: Christoph Hellwig &lt;hch@tuxera.com&gt;
</pre>
</div>
</content>
</entry>
<entry>
<title>hfsplus: fix link corruption</title>
<updated>2010-10-14T13:54:28+00:00</updated>
<author>
<name>Christoph Hellwig</name>
<email>hch@tuxera.com</email>
</author>
<published>2010-10-14T13:54:28+00:00</published>
<link rel='alternate' type='text/html' href='https://git.toradex.cn/cgit/linux-toradex.git/commit/?id=f6089ff87d309a8ddb7b0d4dd92a570f1b0f689b'/>
<id>f6089ff87d309a8ddb7b0d4dd92a570f1b0f689b</id>
<content type='text'>
HFS implements hardlink by using indirect catalog entries that refer to a hidden
directly.  The link target is cached in the dev field in the HFS+ specific
inode, which is also used for the device number for device files, and inside
for passing the nlink value of the indirect node from hfsplus_cat_write_inode
to a helper function.  Now if we happen to write out the indirect node while
hfsplus_link is creating the catalog entry we'll get a link pointing to the
linkid of the current nlink value.  This can easily be reproduced by a large
enough loop of local git-clone operations.

Stop abusing the dev field in the HFS+ inode for short term storage by
refactoring the way the permission structure in the catalog entry is
set up, and rename the dev field to linkid to avoid any confusion.

While we're at it also prevent creating hard links to special files, as
the HFS+ dev and linkid share the same space in the on-disk structure.

Signed-off-by: Christoph Hellwig &lt;hch@tuxera.com&gt;
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
HFS implements hardlink by using indirect catalog entries that refer to a hidden
directly.  The link target is cached in the dev field in the HFS+ specific
inode, which is also used for the device number for device files, and inside
for passing the nlink value of the indirect node from hfsplus_cat_write_inode
to a helper function.  Now if we happen to write out the indirect node while
hfsplus_link is creating the catalog entry we'll get a link pointing to the
linkid of the current nlink value.  This can easily be reproduced by a large
enough loop of local git-clone operations.

Stop abusing the dev field in the HFS+ inode for short term storage by
refactoring the way the permission structure in the catalog entry is
set up, and rename the dev field to linkid to avoid any confusion.

While we're at it also prevent creating hard links to special files, as
the HFS+ dev and linkid share the same space in the on-disk structure.

Signed-off-by: Christoph Hellwig &lt;hch@tuxera.com&gt;
</pre>
</div>
</content>
</entry>
<entry>
<title>hfsplus: fix HFSPLUS_I calling convention</title>
<updated>2010-10-01T03:43:31+00:00</updated>
<author>
<name>Christoph Hellwig</name>
<email>hch@tuxera.com</email>
</author>
<published>2010-10-01T03:43:31+00:00</published>
<link rel='alternate' type='text/html' href='https://git.toradex.cn/cgit/linux-toradex.git/commit/?id=6af502de224c3742936d54eee7e3690c09822934'/>
<id>6af502de224c3742936d54eee7e3690c09822934</id>
<content type='text'>
HFSPLUS_I doesn't return a pointer to the hfsplus-specific inode
information like all other FOO_I macros, but dereference the pointer in a way
that made it look like a direct struct derefence.  This only works as long
as the HFSPLUS_I macro is used directly and prevents us from keepig a local
hfsplus_inode_info pointer.  Fix the calling convention and introduce a local
hip variable in all functions that use it constantly.

Signed-off-by: Christoph Hellwig &lt;hch@tuxera.com&gt;
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
HFSPLUS_I doesn't return a pointer to the hfsplus-specific inode
information like all other FOO_I macros, but dereference the pointer in a way
that made it look like a direct struct derefence.  This only works as long
as the HFSPLUS_I macro is used directly and prevents us from keepig a local
hfsplus_inode_info pointer.  Fix the calling convention and introduce a local
hip variable in all functions that use it constantly.

Signed-off-by: Christoph Hellwig &lt;hch@tuxera.com&gt;
</pre>
</div>
</content>
</entry>
<entry>
<title>hfsplus: fix HFSPLUS_SB calling convention</title>
<updated>2010-10-01T03:42:59+00:00</updated>
<author>
<name>Christoph Hellwig</name>
<email>hch@tuxera.com</email>
</author>
<published>2010-10-01T03:42:59+00:00</published>
<link rel='alternate' type='text/html' href='https://git.toradex.cn/cgit/linux-toradex.git/commit/?id=dd73a01a30d729e8fa6f829c4582650e258e36f9'/>
<id>dd73a01a30d729e8fa6f829c4582650e258e36f9</id>
<content type='text'>
HFSPLUS_SB doesn't return a pointer to the hfsplus-specific superblock
information like all other FOO_SB macros, but dereference the pointer in a way
that made it look like a direct struct derefence.  This only works as long
as the HFSPLUS_SB macro is used directly and prevents us from keepig a local
hfsplus_sb_info pointer.  Fix the calling convention and introduce a local
sbi variable in all functions that use it constantly.

Signed-off-by: Christoph Hellwig &lt;hch@tuxera.com&gt;
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
HFSPLUS_SB doesn't return a pointer to the hfsplus-specific superblock
information like all other FOO_SB macros, but dereference the pointer in a way
that made it look like a direct struct derefence.  This only works as long
as the HFSPLUS_SB macro is used directly and prevents us from keepig a local
hfsplus_sb_info pointer.  Fix the calling convention and introduce a local
sbi variable in all functions that use it constantly.

Signed-off-by: Christoph Hellwig &lt;hch@tuxera.com&gt;
</pre>
</div>
</content>
</entry>
<entry>
<title>hfsplus: fix Buffer overflow with a corrupted image</title>
<updated>2008-10-16T18:21:46+00:00</updated>
<author>
<name>Eric Sesterhenn</name>
<email>snakebyte@gmx.de</email>
</author>
<published>2008-10-16T05:04:08+00:00</published>
<link rel='alternate' type='text/html' href='https://git.toradex.cn/cgit/linux-toradex.git/commit/?id=efc7ffcb4237f8cb9938909041c4ed38f6e1bf40'/>
<id>efc7ffcb4237f8cb9938909041c4ed38f6e1bf40</id>
<content type='text'>
When an hfsplus image gets corrupted it might happen that the catalog
namelength field gets b0rked.  If we mount such an image the memcpy() in
hfsplus_cat_build_key_uni() writes more than the 255 that fit in the name
field.  Depending on the size of the overwritten data, we either only get
memory corruption or also trigger an oops like this:

[  221.628020] BUG: unable to handle kernel paging request at c82b0000
[  221.629066] IP: [&lt;c022d4b1&gt;] hfsplus_find_cat+0x10d/0x151
[  221.629066] *pde = 0ea29163 *pte = 082b0160
[  221.629066] Oops: 0002 [#1] PREEMPT DEBUG_PAGEALLOC
[  221.629066] Modules linked in:
[  221.629066]
[  221.629066] Pid: 4845, comm: mount Not tainted (2.6.27-rc4-00123-gd3ee1b4-dirty #28)
[  221.629066] EIP: 0060:[&lt;c022d4b1&gt;] EFLAGS: 00010206 CPU: 0
[  221.629066] EIP is at hfsplus_find_cat+0x10d/0x151
[  221.629066] EAX: 00000029 EBX: 00016210 ECX: 000042c2 EDX: 00000002
[  221.629066] ESI: c82d70ca EDI: c82b0000 EBP: c82d1bcc ESP: c82d199c
[  221.629066]  DS: 007b ES: 007b FS: 0000 GS: 0033 SS: 0068
[  221.629066] Process mount (pid: 4845, ti=c82d1000 task=c8224060 task.ti=c82d1000)
[  221.629066] Stack: c080b3c4 c82aa8f8 c82d19c2 00016210 c080b3be c82d1bd4 c82aa8f0 00000300
[  221.629066]        01000000 750008b1 74006e00 74006900 65006c00 c82d6400 c013bd35 c8224060
[  221.629066]        00000036 00000046 c82d19f0 00000082 c8224548 c8224060 00000036 c0d653cc
[  221.629066] Call Trace:
[  221.629066]  [&lt;c013bd35&gt;] ? trace_hardirqs_off+0xb/0xd
[  221.629066]  [&lt;c013bca3&gt;] ? trace_hardirqs_off_caller+0x14/0x9b
[  221.629066]  [&lt;c013bd35&gt;] ? trace_hardirqs_off+0xb/0xd
[  221.629066]  [&lt;c013bca3&gt;] ? trace_hardirqs_off_caller+0x14/0x9b
[  221.629066]  [&lt;c013bd35&gt;] ? trace_hardirqs_off+0xb/0xd
[  221.629066]  [&lt;c0107aa3&gt;] ? native_sched_clock+0x82/0x96
[  221.629066]  [&lt;c01302d2&gt;] ? __kernel_text_address+0x1b/0x27
[  221.629066]  [&lt;c010487a&gt;] ? dump_trace+0xca/0xd6
[  221.629066]  [&lt;c0109e32&gt;] ? save_stack_address+0x0/0x2c
[  221.629066]  [&lt;c0109eaf&gt;] ? save_stack_trace+0x1c/0x3a
[  221.629066]  [&lt;c013b571&gt;] ? save_trace+0x37/0x8d
[  221.629066]  [&lt;c013b62e&gt;] ? add_lock_to_list+0x67/0x8d
[  221.629066]  [&lt;c013ea1c&gt;] ? validate_chain+0x8a4/0x9f4
[  221.629066]  [&lt;c013553d&gt;] ? down+0xc/0x2f
[  221.629066]  [&lt;c013f1f6&gt;] ? __lock_acquire+0x68a/0x6e0
[  221.629066]  [&lt;c013bd35&gt;] ? trace_hardirqs_off+0xb/0xd
[  221.629066]  [&lt;c013bca3&gt;] ? trace_hardirqs_off_caller+0x14/0x9b
[  221.629066]  [&lt;c013bd35&gt;] ? trace_hardirqs_off+0xb/0xd
[  221.629066]  [&lt;c0107aa3&gt;] ? native_sched_clock+0x82/0x96
[  221.629066]  [&lt;c013da5d&gt;] ? mark_held_locks+0x43/0x5a
[  221.629066]  [&lt;c013dc3a&gt;] ? trace_hardirqs_on+0xb/0xd
[  221.629066]  [&lt;c013dbf4&gt;] ? trace_hardirqs_on_caller+0xf4/0x12f
[  221.629066]  [&lt;c06abec8&gt;] ? _spin_unlock_irqrestore+0x42/0x58
[  221.629066]  [&lt;c013555c&gt;] ? down+0x2b/0x2f
[  221.629066]  [&lt;c022aa68&gt;] ? hfsplus_iget+0xa0/0x154
[  221.629066]  [&lt;c022b0b9&gt;] ? hfsplus_fill_super+0x280/0x447
[  221.629066]  [&lt;c0107aa3&gt;] ? native_sched_clock+0x82/0x96
[  221.629066]  [&lt;c013bca3&gt;] ? trace_hardirqs_off_caller+0x14/0x9b
[  221.629066]  [&lt;c013bca3&gt;] ? trace_hardirqs_off_caller+0x14/0x9b
[  221.629066]  [&lt;c013f1f6&gt;] ? __lock_acquire+0x68a/0x6e0
[  221.629066]  [&lt;c041c9e4&gt;] ? string+0x2b/0x74
[  221.629066]  [&lt;c041cd16&gt;] ? vsnprintf+0x2e9/0x512
[  221.629066]  [&lt;c010487a&gt;] ? dump_trace+0xca/0xd6
[  221.629066]  [&lt;c0109eaf&gt;] ? save_stack_trace+0x1c/0x3a
[  221.629066]  [&lt;c0109eaf&gt;] ? save_stack_trace+0x1c/0x3a
[  221.629066]  [&lt;c013b571&gt;] ? save_trace+0x37/0x8d
[  221.629066]  [&lt;c013b62e&gt;] ? add_lock_to_list+0x67/0x8d
[  221.629066]  [&lt;c013ea1c&gt;] ? validate_chain+0x8a4/0x9f4
[  221.629066]  [&lt;c01354d3&gt;] ? up+0xc/0x2f
[  221.629066]  [&lt;c013f1f6&gt;] ? __lock_acquire+0x68a/0x6e0
[  221.629066]  [&lt;c013bd35&gt;] ? trace_hardirqs_off+0xb/0xd
[  221.629066]  [&lt;c013bca3&gt;] ? trace_hardirqs_off_caller+0x14/0x9b
[  221.629066]  [&lt;c013bd35&gt;] ? trace_hardirqs_off+0xb/0xd
[  221.629066]  [&lt;c0107aa3&gt;] ? native_sched_clock+0x82/0x96
[  221.629066]  [&lt;c041cfb7&gt;] ? snprintf+0x1b/0x1d
[  221.629066]  [&lt;c01ba466&gt;] ? disk_name+0x25/0x67
[  221.629066]  [&lt;c0183960&gt;] ? get_sb_bdev+0xcd/0x10b
[  221.629066]  [&lt;c016ad92&gt;] ? kstrdup+0x2a/0x4c
[  221.629066]  [&lt;c022a7b3&gt;] ? hfsplus_get_sb+0x13/0x15
[  221.629066]  [&lt;c022ae39&gt;] ? hfsplus_fill_super+0x0/0x447
[  221.629066]  [&lt;c0183583&gt;] ? vfs_kern_mount+0x3b/0x76
[  221.629066]  [&lt;c0183602&gt;] ? do_kern_mount+0x32/0xba
[  221.629066]  [&lt;c01960d4&gt;] ? do_new_mount+0x46/0x74
[  221.629066]  [&lt;c0196277&gt;] ? do_mount+0x175/0x193
[  221.629066]  [&lt;c013dbf4&gt;] ? trace_hardirqs_on_caller+0xf4/0x12f
[  221.629066]  [&lt;c01663b2&gt;] ? __get_free_pages+0x1e/0x24
[  221.629066]  [&lt;c06ac07b&gt;] ? lock_kernel+0x19/0x8c
[  221.629066]  [&lt;c01962e6&gt;] ? sys_mount+0x51/0x9b
[  221.629066]  [&lt;c01962f9&gt;] ? sys_mount+0x64/0x9b
[  221.629066]  [&lt;c01038bd&gt;] ? sysenter_do_call+0x12/0x31
[  221.629066]  =======================
[  221.629066] Code: 89 c2 c1 e2 08 c1 e8 08 09 c2 8b 85 e8 fd ff ff 66 89 50 06 89 c7 53 83 c7 08 56 57 68 c4 b3 80 c0 e8 8c 5c ef ff 89 d9 c1 e9 02 &lt;f3&gt; a5 89 d9 83 e1 03 74 02 f3 a4 83 c3 06 8b 95 e8 fd ff ff 0f
[  221.629066] EIP: [&lt;c022d4b1&gt;] hfsplus_find_cat+0x10d/0x151 SS:ESP 0068:c82d199c
[  221.629066] ---[ end trace e417a1d67f0d0066 ]---

Since hfsplus_cat_build_key_uni() returns void and only has one callsite,
the check is performed at the callsite.

Signed-off-by: Eric Sesterhenn &lt;snakebyte@gmx.de&gt;
Reviewed-by: Pekka Enberg &lt;penberg@cs.helsinki.fi&gt;
Cc: Roman Zippel &lt;zippel@linux-m68k.org&gt;
Signed-off-by: Andrew Morton &lt;akpm@linux-foundation.org&gt;
Signed-off-by: Linus Torvalds &lt;torvalds@linux-foundation.org&gt;
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
When an hfsplus image gets corrupted it might happen that the catalog
namelength field gets b0rked.  If we mount such an image the memcpy() in
hfsplus_cat_build_key_uni() writes more than the 255 that fit in the name
field.  Depending on the size of the overwritten data, we either only get
memory corruption or also trigger an oops like this:

[  221.628020] BUG: unable to handle kernel paging request at c82b0000
[  221.629066] IP: [&lt;c022d4b1&gt;] hfsplus_find_cat+0x10d/0x151
[  221.629066] *pde = 0ea29163 *pte = 082b0160
[  221.629066] Oops: 0002 [#1] PREEMPT DEBUG_PAGEALLOC
[  221.629066] Modules linked in:
[  221.629066]
[  221.629066] Pid: 4845, comm: mount Not tainted (2.6.27-rc4-00123-gd3ee1b4-dirty #28)
[  221.629066] EIP: 0060:[&lt;c022d4b1&gt;] EFLAGS: 00010206 CPU: 0
[  221.629066] EIP is at hfsplus_find_cat+0x10d/0x151
[  221.629066] EAX: 00000029 EBX: 00016210 ECX: 000042c2 EDX: 00000002
[  221.629066] ESI: c82d70ca EDI: c82b0000 EBP: c82d1bcc ESP: c82d199c
[  221.629066]  DS: 007b ES: 007b FS: 0000 GS: 0033 SS: 0068
[  221.629066] Process mount (pid: 4845, ti=c82d1000 task=c8224060 task.ti=c82d1000)
[  221.629066] Stack: c080b3c4 c82aa8f8 c82d19c2 00016210 c080b3be c82d1bd4 c82aa8f0 00000300
[  221.629066]        01000000 750008b1 74006e00 74006900 65006c00 c82d6400 c013bd35 c8224060
[  221.629066]        00000036 00000046 c82d19f0 00000082 c8224548 c8224060 00000036 c0d653cc
[  221.629066] Call Trace:
[  221.629066]  [&lt;c013bd35&gt;] ? trace_hardirqs_off+0xb/0xd
[  221.629066]  [&lt;c013bca3&gt;] ? trace_hardirqs_off_caller+0x14/0x9b
[  221.629066]  [&lt;c013bd35&gt;] ? trace_hardirqs_off+0xb/0xd
[  221.629066]  [&lt;c013bca3&gt;] ? trace_hardirqs_off_caller+0x14/0x9b
[  221.629066]  [&lt;c013bd35&gt;] ? trace_hardirqs_off+0xb/0xd
[  221.629066]  [&lt;c0107aa3&gt;] ? native_sched_clock+0x82/0x96
[  221.629066]  [&lt;c01302d2&gt;] ? __kernel_text_address+0x1b/0x27
[  221.629066]  [&lt;c010487a&gt;] ? dump_trace+0xca/0xd6
[  221.629066]  [&lt;c0109e32&gt;] ? save_stack_address+0x0/0x2c
[  221.629066]  [&lt;c0109eaf&gt;] ? save_stack_trace+0x1c/0x3a
[  221.629066]  [&lt;c013b571&gt;] ? save_trace+0x37/0x8d
[  221.629066]  [&lt;c013b62e&gt;] ? add_lock_to_list+0x67/0x8d
[  221.629066]  [&lt;c013ea1c&gt;] ? validate_chain+0x8a4/0x9f4
[  221.629066]  [&lt;c013553d&gt;] ? down+0xc/0x2f
[  221.629066]  [&lt;c013f1f6&gt;] ? __lock_acquire+0x68a/0x6e0
[  221.629066]  [&lt;c013bd35&gt;] ? trace_hardirqs_off+0xb/0xd
[  221.629066]  [&lt;c013bca3&gt;] ? trace_hardirqs_off_caller+0x14/0x9b
[  221.629066]  [&lt;c013bd35&gt;] ? trace_hardirqs_off+0xb/0xd
[  221.629066]  [&lt;c0107aa3&gt;] ? native_sched_clock+0x82/0x96
[  221.629066]  [&lt;c013da5d&gt;] ? mark_held_locks+0x43/0x5a
[  221.629066]  [&lt;c013dc3a&gt;] ? trace_hardirqs_on+0xb/0xd
[  221.629066]  [&lt;c013dbf4&gt;] ? trace_hardirqs_on_caller+0xf4/0x12f
[  221.629066]  [&lt;c06abec8&gt;] ? _spin_unlock_irqrestore+0x42/0x58
[  221.629066]  [&lt;c013555c&gt;] ? down+0x2b/0x2f
[  221.629066]  [&lt;c022aa68&gt;] ? hfsplus_iget+0xa0/0x154
[  221.629066]  [&lt;c022b0b9&gt;] ? hfsplus_fill_super+0x280/0x447
[  221.629066]  [&lt;c0107aa3&gt;] ? native_sched_clock+0x82/0x96
[  221.629066]  [&lt;c013bca3&gt;] ? trace_hardirqs_off_caller+0x14/0x9b
[  221.629066]  [&lt;c013bca3&gt;] ? trace_hardirqs_off_caller+0x14/0x9b
[  221.629066]  [&lt;c013f1f6&gt;] ? __lock_acquire+0x68a/0x6e0
[  221.629066]  [&lt;c041c9e4&gt;] ? string+0x2b/0x74
[  221.629066]  [&lt;c041cd16&gt;] ? vsnprintf+0x2e9/0x512
[  221.629066]  [&lt;c010487a&gt;] ? dump_trace+0xca/0xd6
[  221.629066]  [&lt;c0109eaf&gt;] ? save_stack_trace+0x1c/0x3a
[  221.629066]  [&lt;c0109eaf&gt;] ? save_stack_trace+0x1c/0x3a
[  221.629066]  [&lt;c013b571&gt;] ? save_trace+0x37/0x8d
[  221.629066]  [&lt;c013b62e&gt;] ? add_lock_to_list+0x67/0x8d
[  221.629066]  [&lt;c013ea1c&gt;] ? validate_chain+0x8a4/0x9f4
[  221.629066]  [&lt;c01354d3&gt;] ? up+0xc/0x2f
[  221.629066]  [&lt;c013f1f6&gt;] ? __lock_acquire+0x68a/0x6e0
[  221.629066]  [&lt;c013bd35&gt;] ? trace_hardirqs_off+0xb/0xd
[  221.629066]  [&lt;c013bca3&gt;] ? trace_hardirqs_off_caller+0x14/0x9b
[  221.629066]  [&lt;c013bd35&gt;] ? trace_hardirqs_off+0xb/0xd
[  221.629066]  [&lt;c0107aa3&gt;] ? native_sched_clock+0x82/0x96
[  221.629066]  [&lt;c041cfb7&gt;] ? snprintf+0x1b/0x1d
[  221.629066]  [&lt;c01ba466&gt;] ? disk_name+0x25/0x67
[  221.629066]  [&lt;c0183960&gt;] ? get_sb_bdev+0xcd/0x10b
[  221.629066]  [&lt;c016ad92&gt;] ? kstrdup+0x2a/0x4c
[  221.629066]  [&lt;c022a7b3&gt;] ? hfsplus_get_sb+0x13/0x15
[  221.629066]  [&lt;c022ae39&gt;] ? hfsplus_fill_super+0x0/0x447
[  221.629066]  [&lt;c0183583&gt;] ? vfs_kern_mount+0x3b/0x76
[  221.629066]  [&lt;c0183602&gt;] ? do_kern_mount+0x32/0xba
[  221.629066]  [&lt;c01960d4&gt;] ? do_new_mount+0x46/0x74
[  221.629066]  [&lt;c0196277&gt;] ? do_mount+0x175/0x193
[  221.629066]  [&lt;c013dbf4&gt;] ? trace_hardirqs_on_caller+0xf4/0x12f
[  221.629066]  [&lt;c01663b2&gt;] ? __get_free_pages+0x1e/0x24
[  221.629066]  [&lt;c06ac07b&gt;] ? lock_kernel+0x19/0x8c
[  221.629066]  [&lt;c01962e6&gt;] ? sys_mount+0x51/0x9b
[  221.629066]  [&lt;c01962f9&gt;] ? sys_mount+0x64/0x9b
[  221.629066]  [&lt;c01038bd&gt;] ? sysenter_do_call+0x12/0x31
[  221.629066]  =======================
[  221.629066] Code: 89 c2 c1 e2 08 c1 e8 08 09 c2 8b 85 e8 fd ff ff 66 89 50 06 89 c7 53 83 c7 08 56 57 68 c4 b3 80 c0 e8 8c 5c ef ff 89 d9 c1 e9 02 &lt;f3&gt; a5 89 d9 83 e1 03 74 02 f3 a4 83 c3 06 8b 95 e8 fd ff ff 0f
[  221.629066] EIP: [&lt;c022d4b1&gt;] hfsplus_find_cat+0x10d/0x151 SS:ESP 0068:c82d199c
[  221.629066] ---[ end trace e417a1d67f0d0066 ]---

Since hfsplus_cat_build_key_uni() returns void and only has one callsite,
the check is performed at the callsite.

Signed-off-by: Eric Sesterhenn &lt;snakebyte@gmx.de&gt;
Reviewed-by: Pekka Enberg &lt;penberg@cs.helsinki.fi&gt;
Cc: Roman Zippel &lt;zippel@linux-m68k.org&gt;
Signed-off-by: Andrew Morton &lt;akpm@linux-foundation.org&gt;
Signed-off-by: Linus Torvalds &lt;torvalds@linux-foundation.org&gt;
</pre>
</div>
</content>
</entry>
</feed>
