linux/fs/udf
Alden Tondettar 7888824b0b udf: Use correct partition reference number for metadata
UDF/OSTA terminology is confusing. Partition Numbers (PNs) are arbitrary
16-bit values, one for each physical partition in the volume.  Partition
Reference Numbers (PRNs) are indices into the the Partition Map Table
and do not necessarily equal the PN of the mapped partition.

The current metadata code mistakenly uses the PN instead of the PRN when
mapping metadata blocks to physical/sparable blocks.  Windows-created
UDF 2.5 discs for some reason use large, arbitrary PNs, resulting in
mount failure and KASAN read warnings in udf_read_inode().

For example, a NetBSD UDF 2.5 partition might look like this:

PRN PN Type
--- -- ----
  0  0 Sparable
  1  0 Metadata

Since PRN == PN, we are fine.

But Windows could gives us:

PRN PN   Type
--- ---- ----
  0 8192 Sparable
  1 8192 Metadata

So udf_read_inode() will start out by checking the partition length in
sbi->s_partmaps[8192], which is obviously out of bounds.

Fix this by creating a new field (s_phys_partition_ref) in struct
udf_meta_data, referencing whatever physical or sparable map has the
same partition number as the metadata partition.

[JK: Add comment about s_phys_partition_ref, change its name]

Signed-off-by: Alden Tondettar <alden.tondettar@gmail.com>
Signed-off-by: Jan Kara <jack@suse.cz>
2016-05-19 13:00:35 +02:00
..
balloc.c udf: Factor out code for creating indirect extent 2015-12-23 18:04:52 +01:00
dir.c more trivial ->iterate_shared conversions 2016-05-09 11:41:14 -04:00
directory.c udf: remove redundant buffer_head.h includes 2015-03-14 07:54:02 +01:00
ecma_167.h Remove struct typedefs from fs/udf/ecma_167.h et al. 2009-04-02 12:29:47 +02:00
file.c fs: simplify the generic_write_sync prototype 2016-05-01 19:58:39 -04:00
ialloc.c udf: saner calling conventions for udf_new_inode() 2014-09-04 21:37:41 +02:00
inode.c direct-io: eliminate the offset argument to ->direct_IO 2016-05-01 19:58:39 -04:00
Kconfig udf: Update Kconfig description 2015-01-05 11:04:37 +01:00
lowlevel.c udf: use linux/uaccess.h 2014-07-15 22:40:23 +02:00
Makefile switch udf to simple_fsync() 2009-06-11 21:36:13 -04:00
misc.c udf: remove redundant buffer_head.h includes 2015-03-14 07:54:02 +01:00
namei.c don't bother with ->d_inode->i_sb - it's always equal to ->d_sb 2016-04-10 17:11:51 -04:00
osta_udf.h Remove struct typedefs from fs/udf/ecma_167.h et al. 2009-04-02 12:29:47 +02:00
partition.c udf: Use correct partition reference number for metadata 2016-05-19 13:00:35 +02:00
super.c udf: Use correct partition reference number for metadata 2016-05-19 13:00:35 +02:00
symlink.c don't put symlink bodies in pagecache into highmem 2015-12-08 22:41:36 -05:00
truncate.c udf: remove redundant buffer_head.h includes 2015-03-14 07:54:02 +01:00
udf_i.h fs: cleanup slight list_entry abuse 2015-06-23 18:01:59 -04:00
udf_sb.h udf: Use correct partition reference number for metadata 2016-05-19 13:00:35 +02:00
udfdecl.h udf: Fix conversion of 'dstring' fields to UTF8 2016-04-25 15:18:50 +02:00
udfend.h Remove struct typedefs from fs/udf/ecma_167.h et al. 2009-04-02 12:29:47 +02:00
udftime.c udf: remove redundant sys_tz declaration 2014-09-29 13:45:12 +02:00
unicode.c udf: Fix conversion of 'dstring' fields to UTF8 2016-04-25 15:18:50 +02:00