diff mbox series

block: add capacity validation in bdev_add_partition()

Message ID 20230615160929.9240-1-min15.li@samsung.com (mailing list archive)
State New, archived
Headers show
Series block: add capacity validation in bdev_add_partition() | expand

Commit Message

Min Li June 15, 2023, 4:09 p.m. UTC
In the function bdev_add_partition(),there is no check that the start
and end sectors exceed the size of the disk before calling add_partition.
When we call the block's ioctl interface directly to add a partition,
and the capacity of the disk is set to 0 by driver,the command will
continue to execute.

Signed-off-by: min15.li <min15.li@samsung.com>
---
 block/partitions/core.c | 6 ++++++
 1 file changed, 6 insertions(+)

Comments

Damien Le Moal June 15, 2023, 8:42 a.m. UTC | #1
On 6/16/23 01:09, min15.li wrote:
> In the function bdev_add_partition(),there is no check that the start
> and end sectors exceed the size of the disk before calling add_partition.
> When we call the block's ioctl interface directly to add a partition,
> and the capacity of the disk is set to 0 by driver,the command will
> continue to execute.
> 
> Signed-off-by: min15.li <min15.li@samsung.com>
> ---
>  block/partitions/core.c | 6 ++++++
>  1 file changed, 6 insertions(+)
> 
> diff --git a/block/partitions/core.c b/block/partitions/core.c
> index 49e0496ff23c..9806a804e1a4 100644
> --- a/block/partitions/core.c
> +++ b/block/partitions/core.c
> @@ -445,6 +445,12 @@ int bdev_add_partition(struct gendisk *disk, int partno, sector_t start,
>  		goto out;
>  	}
>  
> +	if (start >= get_capacity(disk) ||
> +		start + length > get_capacity(disk)) {

declaring:

	sector_t capacity = get_capacity(disk);

at the beginning of the function would make this check prettier and fit on one line.

> +		ret = -EINVAL;
> +		goto out;
> +	}
> +
>  	if (partition_overlaps(disk, start, length, -1)) {
>  		ret = -EBUSY;
>  		goto out;
Christoph Hellwig June 15, 2023, 8:44 a.m. UTC | #2
On Thu, Jun 15, 2023 at 04:09:29PM +0000, min15.li wrote:
> +	if (start >= get_capacity(disk) ||
> +		start + length > get_capacity(disk)) {

We need to check for overflows of the start + length value,
probably best using a helper like check_add_overflow.

Also a single tab indent (and thus the same as code below) is always
wrong for continuations, plase use either two tabs or align to the
opening brace.
Greg Kroah-Hartman June 15, 2023, 8:45 a.m. UTC | #3
On Thu, Jun 15, 2023 at 04:09:29PM +0000, min15.li wrote:
> In the function bdev_add_partition(),there is no check that the start
> and end sectors exceed the size of the disk before calling add_partition.
> When we call the block's ioctl interface directly to add a partition,
> and the capacity of the disk is set to 0 by driver,the command will
> continue to execute.
> 
> Signed-off-by: min15.li <min15.li@samsung.com>
> ---
>  block/partitions/core.c | 6 ++++++
>  1 file changed, 6 insertions(+)
> 
> diff --git a/block/partitions/core.c b/block/partitions/core.c
> index 49e0496ff23c..9806a804e1a4 100644
> --- a/block/partitions/core.c
> +++ b/block/partitions/core.c
> @@ -445,6 +445,12 @@ int bdev_add_partition(struct gendisk *disk, int partno, sector_t start,
>  		goto out;
>  	}
>  
> +	if (start >= get_capacity(disk) ||
> +		start + length > get_capacity(disk)) {
> +		ret = -EINVAL;
> +		goto out;
> +	}
> +
>  	if (partition_overlaps(disk, start, length, -1)) {
>  		ret = -EBUSY;
>  		goto out;
> -- 
> 2.34.1
> 

Hi,

This is the friendly patch-bot of Greg Kroah-Hartman.  You have sent him
a patch that has triggered this response.  He used to manually respond
to these common problems, but in order to save his sanity (he kept
writing the same thing over and over, yet to different people), I was
created.  Hopefully you will not take offence and will fix the problem
in your patch and resubmit it so that it can be accepted into the Linux
kernel tree.

You are receiving this message because of the following common error(s)
as indicated below:

- It looks like you did not use your "real" name for the patch on either
  the Signed-off-by: line, or the From: line (both of which have to
  match).  Please read the kernel file,
  Documentation/process/submitting-patches.rst for how to do this
  correctly.

If you wish to discuss this problem further, or you have questions about
how to resolve this issue, please feel free to respond to this email and
Greg will reply once he has dug out from the pending patches received
from other developers.

thanks,

greg k-h's patch email bot
diff mbox series

Patch

diff --git a/block/partitions/core.c b/block/partitions/core.c
index 49e0496ff23c..9806a804e1a4 100644
--- a/block/partitions/core.c
+++ b/block/partitions/core.c
@@ -445,6 +445,12 @@  int bdev_add_partition(struct gendisk *disk, int partno, sector_t start,
 		goto out;
 	}
 
+	if (start >= get_capacity(disk) ||
+		start + length > get_capacity(disk)) {
+		ret = -EINVAL;
+		goto out;
+	}
+
 	if (partition_overlaps(disk, start, length, -1)) {
 		ret = -EBUSY;
 		goto out;