linux/drivers/s390/block
Stefan Haberland 15eb93c406 s390/dasd: fix using offset into zero size array error
commit 4a8ef6999b upstream.

Dan Carpenter reported the following:

The patch 52898025cf: "[S390] dasd: security and PSF update patch
for EMC CKD ioctl" from Mar 8, 2010, leads to the following static
checker warning:

	drivers/s390/block/dasd_eckd.c:4486 dasd_symm_io()
	error: using offset into zero size array 'psf_data[]'

drivers/s390/block/dasd_eckd.c
  4458          /* Copy parms from caller */
  4459          rc = -EFAULT;
  4460          if (copy_from_user(&usrparm, argp, sizeof(usrparm)))
                                    ^^^^^^^
The user can specify any "usrparm.psf_data_len".  They choose zero by
mistake.

  4461                  goto out;
  4462          if (is_compat_task()) {
  4463                  /* Make sure pointers are sane even on 31 bit. */
  4464                  rc = -EINVAL;
  4465                  if ((usrparm.psf_data >> 32) != 0)
  4466                          goto out;
  4467                  if ((usrparm.rssd_result >> 32) != 0)
  4468                          goto out;
  4469                  usrparm.psf_data &= 0x7fffffffULL;
  4470                  usrparm.rssd_result &= 0x7fffffffULL;
  4471          }
  4472          /* alloc I/O data area */
  4473          psf_data = kzalloc(usrparm.psf_data_len, GFP_KERNEL
  			   				 | GFP_DMA);
  4474          rssd_result = kzalloc(usrparm.rssd_result_len, GFP_KERNEL
							       | GFP_DMA);
  4475          if (!psf_data || !rssd_result) {

kzalloc() returns a ZERO_SIZE_PTR (0x16).

  4476                  rc = -ENOMEM;
  4477                  goto out_free;
  4478          }
  4479
  4480          /* get syscall header from user space */
  4481          rc = -EFAULT;
  4482          if (copy_from_user(psf_data,
  4483                             (void __user *)(unsigned long)
  				   	 		 usrparm.psf_data,
  4484                             usrparm.psf_data_len))

That all works great.

  4485                  goto out_free;
  4486          psf0 = psf_data[0];
  4487          psf1 = psf_data[1];

But now we're assuming that "->psf_data_len" was at least 2 bytes.

Fix this by checking the user specified length psf_data_len.

Fixes: 52898025cf ("[S390] dasd: security and PSF update patch for EMC CKD ioctl")
Reported-by: Dan Carpenter <dan.carpenter@oracle.com>
Signed-off-by: Stefan Haberland <sth@linux.ibm.com>
Signed-off-by: Martin Schwidefsky <schwidefsky@de.ibm.com>
Signed-off-by: Ben Hutchings <ben@decadent.org.uk>
History 2019-05-02 21:41:31 +01:00
..
dasd.c s390/dasd: fix hanging device after clear subchannel 2016-11-20 01:17:08 +00:00
dasd_3990_erp.c s390/time: rename tod clock access functions 2013-02-14 15:55:10 +01:00
dasd_alias.c s390/dasd: Restore a necessary cast 2019-02-11 17:53:13 +00:00
dasd_devmap.c s390: replace strict_strtoul() with kstrtoul() 2013-08-22 12:20:00 +02:00
dasd_diag.c s390/irq: Use defines for external interruption codes 2014-04-03 14:30:52 +02:00
dasd_diag.h s390/comments: unify copyright messages and remove file names 2012-07-20 11:15:04 +02:00
dasd_eckd.c s390/dasd: fix using offset into zero size array error 2019-05-02 21:41:31 +01:00
dasd_eckd.h s390/comments: unify copyright messages and remove file names 2012-07-20 11:15:04 +02:00
dasd_eer.c s390/time: rename tod clock access functions 2013-02-14 15:55:10 +01:00
dasd_erp.c s390/dasd: fix statistics for recovered requests 2013-08-28 09:19:34 +02:00
dasd_fba.c block: Convert bio_for_each_segment() to bvec_iter 2013-11-23 22:33:49 -08:00
dasd_fba.h s390/comments: unify copyright messages and remove file names 2012-07-20 11:15:04 +02:00
dasd_genhd.c s390/dasd: fix memory leak caused by dangling references to request_queue 2013-12-02 15:31:06 +01:00
dasd_int.h s390/dasd: Fail all requests when DASD_FLAG_ABORTIO is set 2013-07-01 17:31:26 +02:00
dasd_ioctl.c s390/dasd: Fail all requests when DASD_FLAG_ABORTIO is set 2013-07-01 17:31:26 +02:00
dasd_proc.c s390/comments: unify copyright messages and remove file names 2012-07-20 11:15:04 +02:00
dcssblk.c s390: avoid format strings leaking into names 2014-06-11 10:13:27 +02:00
Kconfig s390/scm_block: force cluster writes 2012-09-26 15:45:01 +02:00
Makefile s390/scm_block: force cluster writes 2012-09-26 15:45:01 +02:00
scm_blk.c s390/scm_blk: fix deadlock for requests != REQ_TYPE_FS 2016-06-15 21:29:22 +01:00
scm_blk.h s390/s390dbf: use debug_level_enabled() where applicable 2013-10-24 17:16:54 +02:00
scm_blk_cluster.c block: Convert bio_for_each_segment() to bvec_iter 2013-11-23 22:33:49 -08:00
scm_drv.c s390/scm_block: fix printk format string 2013-03-21 13:35:37 +01:00
xpram.c Merge branch 'for-3.14/core' of git://git.kernel.dk/linux-block 2014-01-30 11:19:05 -08:00