udf: check partition reference in udf_read_inode()
authorFabian Frederick <fabf@skynet.be>
Fri, 6 Jan 2017 20:54:43 +0000 (21:54 +0100)
committerJan Kara <jack@suse.cz>
Tue, 10 Jan 2017 10:59:21 +0000 (11:59 +0100)
We were checking block number without checking partition.
sbi->s_partmaps[iloc->partitionReferenceNum] could lead to
bad memory access. See udf_nfs_get_inode() path for instance.

Signed-off-by: Fabian Frederick <fabf@skynet.be>
Signed-off-by: Jan Kara <jack@suse.cz>
fs/udf/inode.c

index 2296c87..8ec6b3d 100644 (file)
@@ -1277,6 +1277,12 @@ static int udf_read_inode(struct inode *inode, bool hidden_inode)
        int ret = -EIO;
 
 reread:
+       if (iloc->partitionReferenceNum >= sbi->s_partitions) {
+               udf_debug("partition reference: %d > logical volume partitions: %d\n",
+                         iloc->partitionReferenceNum, sbi->s_partitions);
+               return -EIO;
+       }
+
        if (iloc->logicalBlockNum >=
            sbi->s_partmaps[iloc->partitionReferenceNum].s_partition_len) {
                udf_debug("block=%d, partition=%d out of range\n",