public inbox for linux-kernel@vger.kernel.org
 help / color / mirror / Atom feed
* [PATCH 3/8] dm: prevent possible buffer overflow in ioctl interface
  2003-02-26 17:05 device-mapper patchset 2.5.63-dm-1 Joe Thornber
@ 2003-02-26 17:09 ` Joe Thornber
  2003-02-26 21:04   ` Horst von Brand
  0 siblings, 1 reply; 10+ messages in thread
From: Joe Thornber @ 2003-02-26 17:09 UTC (permalink / raw)
  To: Linus Torvalds, Linux Mailing List

Use the correct size for "name" in register_with_devfs().

During Al Viro's devfs cleanup a few versions ago, this function was
rewritten, and the "name" string added. The 32-byte size is not large
enough to prevent a possible buffer overflow in the sprintf() call,
since the hash cell can have a name up to 128 characters.

[Kevin Corry]

--- diff/drivers/md/dm-ioctl.c	2003-02-26 16:09:42.000000000 +0000
+++ source/drivers/md/dm-ioctl.c	2003-02-26 16:09:52.000000000 +0000
@@ -173,7 +173,7 @@
  */
 static int register_with_devfs(struct hash_cell *hc)
 {
-	char name[32];
+	char name[DM_NAME_LEN + strlen(DM_DIR) + 1];
 	struct gendisk *disk = dm_disk(hc->md);
 
 	sprintf(name, DM_DIR "/%s", hc->name);

^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: [PATCH 3/8] dm: prevent possible buffer overflow in ioctl interface
  2003-02-26 17:09 ` [PATCH 3/8] dm: prevent possible buffer overflow in ioctl interface Joe Thornber
@ 2003-02-26 21:04   ` Horst von Brand
  2003-02-27 14:20     ` Kevin Corry
  0 siblings, 1 reply; 10+ messages in thread
From: Horst von Brand @ 2003-02-26 21:04 UTC (permalink / raw)
  To: Joe Thornber; +Cc: Linus Torvalds, Linux Mailing List, vonbrand

Joe Thornber <joe@fib011235813.fsnet.co.uk> said:
> Use the correct size for "name" in register_with_devfs().
> 
> During Al Viro's devfs cleanup a few versions ago, this function was
> rewritten, and the "name" string added. The 32-byte size is not large
> enough to prevent a possible buffer overflow in the sprintf() call,
> since the hash cell can have a name up to 128 characters.
> 
> [Kevin Corry]
> 
> --- diff/drivers/md/dm-ioctl.c	2003-02-26 16:09:42.000000000 +0000
> +++ source/drivers/md/dm-ioctl.c	2003-02-26 16:09:52.000000000 +0000
> @@ -173,7 +173,7 @@
>   */
>  static int register_with_devfs(struct hash_cell *hc)
>  {
> -	char name[32];
> +	char name[DM_NAME_LEN + strlen(DM_DIR) + 1];

This either makes a large name array or generates a possibly huge array at
runtime (bad if your stack is < 8KiB).
-- 
Dr. Horst H. von Brand                   User #22616 counter.li.org
Departamento de Informatica                     Fono: +56 32 654431
Universidad Tecnica Federico Santa Maria              +56 32 654239
Casilla 110-V, Valparaiso, Chile                Fax:  +56 32 797513

^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: [PATCH 3/8] dm: prevent possible buffer overflow in ioctl interface
  2003-02-26 21:04   ` Horst von Brand
@ 2003-02-27 14:20     ` Kevin Corry
  2003-02-27 14:36       ` Kevin Corry
  0 siblings, 1 reply; 10+ messages in thread
From: Kevin Corry @ 2003-02-27 14:20 UTC (permalink / raw)
  To: Horst von Brand, Joe Thornber
  Cc: Linus Torvalds, Linux Mailing List, vonbrand

On Wednesday 26 February 2003 15:04, Horst von Brand wrote:
> Joe Thornber <joe@fib011235813.fsnet.co.uk> said:
> > Use the correct size for "name" in register_with_devfs().
> >
> > During Al Viro's devfs cleanup a few versions ago, this function was
> > rewritten, and the "name" string added. The 32-byte size is not large
> > enough to prevent a possible buffer overflow in the sprintf() call,
> > since the hash cell can have a name up to 128 characters.
> >
> > [Kevin Corry]
> >
> > --- diff/drivers/md/dm-ioctl.c	2003-02-26 16:09:42.000000000 +0000
> > +++ source/drivers/md/dm-ioctl.c	2003-02-26 16:09:52.000000000 +0000
> > @@ -173,7 +173,7 @@
> >   */
> >  static int register_with_devfs(struct hash_cell *hc)
> >  {
> > -	char name[32];
> > +	char name[DM_NAME_LEN + strlen(DM_DIR) + 1];
>
> This either makes a large name array or generates a possibly huge array at
> runtime (bad if your stack is < 8KiB).

Would this be better?

-- 
Kevin Corry
corryk@us.ibm.com
http://evms.sourceforge.net/


--- linux-2.5.60a/drivers/md/dm-ioctl.c	2003/02/13 16:43:26
+++ linux-2.5.60b/drivers/md/dm-ioctl.c	2003/02/27 14:17:00
@@ -173,8 +173,11 @@
  */
 static int register_with_devfs(struct hash_cell *hc)
 {
-	char name[DM_NAME_LEN + strlen(DM_DIR) + 1];
 	struct gendisk *disk = dm_disk(hc->md);
+	char *name = kmalloc(DM_NAME_LEN + strlen(DM_DIR) + 1);
+	if (!name) {
+		return -ENOMEM;
+	}
 
 	sprintf(name, DM_DIR "/%s", hc->name);
 	devfs_register(NULL, name, DEVFS_FL_CURRENT_OWNER,
\x10

^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: [PATCH 3/8] dm: prevent possible buffer overflow in ioctl interface
  2003-02-27 14:20     ` Kevin Corry
@ 2003-02-27 14:36       ` Kevin Corry
  2003-02-27 16:25         ` Roland Dreier
  0 siblings, 1 reply; 10+ messages in thread
From: Kevin Corry @ 2003-02-27 14:36 UTC (permalink / raw)
  To: Horst von Brand, Joe Thornber; +Cc: Linus Torvalds, Linux Mailing List

On Thursday 27 February 2003 08:20, Kevin Corry wrote:
> On Wednesday 26 February 2003 15:04, Horst von Brand wrote:
> > Joe Thornber <joe@fib011235813.fsnet.co.uk> said:
> > > Use the correct size for "name" in register_with_devfs().
> > >
> > > During Al Viro's devfs cleanup a few versions ago, this function was
> > > rewritten, and the "name" string added. The 32-byte size is not large
> > > enough to prevent a possible buffer overflow in the sprintf() call,
> > > since the hash cell can have a name up to 128 characters.
> > >
> > > [Kevin Corry]
> > >
> > > --- diff/drivers/md/dm-ioctl.c	2003-02-26 16:09:42.000000000 +0000
> > > +++ source/drivers/md/dm-ioctl.c	2003-02-26 16:09:52.000000000 +0000
> > > @@ -173,7 +173,7 @@
> > >   */
> > >  static int register_with_devfs(struct hash_cell *hc)
> > >  {
> > > -	char name[32];
> > > +	char name[DM_NAME_LEN + strlen(DM_DIR) + 1];
> >
> > This either makes a large name array or generates a possibly huge array
> > at runtime (bad if your stack is < 8KiB).
>
> Would this be better?

As Joe pointed out to me, that should have been:

--- linux-2.5.60a/drivers/md/dm-ioctl.c	2003/02/13 16:43:26
+++ linux-2.5.60b/drivers/md/dm-ioctl.c	2003/02/27 14:35:20
@@ -173,14 +173,18 @@
  */
 static int register_with_devfs(struct hash_cell *hc)
 {
-	char name[DM_NAME_LEN + strlen(DM_DIR) + 1];
 	struct gendisk *disk = dm_disk(hc->md);
+	char *name = kmalloc(DM_NAME_LEN + strlen(DM_DIR) + 1);
+	if (!name) {
+		return -ENOMEM;
+	}
 
 	sprintf(name, DM_DIR "/%s", hc->name);
 	devfs_register(NULL, name, DEVFS_FL_CURRENT_OWNER,
 		       disk->major, disk->first_minor,
 		       S_IFBLK | S_IRUSR | S_IWUSR | S_IRGRP,
 		       &dm_blk_dops, NULL);
+	kfree(name);
 	return 0;
 }
 

^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: [PATCH 3/8] dm: prevent possible buffer overflow in ioctl interface
  2003-02-27 14:36       ` Kevin Corry
@ 2003-02-27 16:25         ` Roland Dreier
  2003-02-27 16:34           ` Kevin Corry
  2003-02-27 22:05           ` Kevin Corry
  0 siblings, 2 replies; 10+ messages in thread
From: Roland Dreier @ 2003-02-27 16:25 UTC (permalink / raw)
  To: Kevin Corry; +Cc: Linux Mailing List

   > +	char *name = kmalloc(DM_NAME_LEN + strlen(DM_DIR) + 1);
   > +	if (!name) {
   > +		return -ENOMEM;
   > +	}

Also, kmalloc() needs a second "GFP_xxx" parameter (I guess GFP_KERNEL
in this case, although I don't know the context this function is
called from).

 - Roland


^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: [PATCH 3/8] dm: prevent possible buffer overflow in ioctl interface
  2003-02-27 16:25         ` Roland Dreier
@ 2003-02-27 16:34           ` Kevin Corry
  2003-02-27 22:05           ` Kevin Corry
  1 sibling, 0 replies; 10+ messages in thread
From: Kevin Corry @ 2003-02-27 16:34 UTC (permalink / raw)
  To: Roland Dreier, Joe Thornber; +Cc: Linux Mailing List, Linus Torvalds

On Thursday 27 February 2003 10:25, Roland Dreier wrote:
>    > +	char *name = kmalloc(DM_NAME_LEN + strlen(DM_DIR) + 1);
>    > +	if (!name) {
>    > +		return -ENOMEM;
>    > +	}
>
> Also, kmalloc() needs a second "GFP_xxx" parameter (I guess GFP_KERNEL
> in this case, although I don't know the context this function is
> called from).
>
>  - Roland

Dammit! I'm not having a good morning. :(

Unfortunately, Linus seems to have committed that patch already. So here is a 
patch to fix just that line.

Thanks for catching that.

-- 
Kevin Corry
corryk@us.ibm.com
http://evms.sourceforge.net/

--- a/drivers/md/dm-ioctl.c	2003/02/27 16:29:58
+++ b/drivers/md/dm-ioctl.c	2003/02/27 16:30:03
@@ -174,7 +174,7 @@
 static int register_with_devfs(struct hash_cell *hc)
 {
 	struct gendisk *disk = dm_disk(hc->md);
-	char *name = kmalloc(DM_NAME_LEN + strlen(DM_DIR) + 1);
+	char *name = kmalloc(DM_NAME_LEN + strlen(DM_DIR) + 1, GFP_KERNEL);
 	if (!name) {
 		return -ENOMEM;
 	}

^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: [PATCH 3/8] dm: prevent possible buffer overflow in ioctl interface
  2003-02-27 16:25         ` Roland Dreier
  2003-02-27 16:34           ` Kevin Corry
@ 2003-02-27 22:05           ` Kevin Corry
  1 sibling, 0 replies; 10+ messages in thread
From: Kevin Corry @ 2003-02-27 22:05 UTC (permalink / raw)
  To: Roland Dreier, Linus Torvalds; +Cc: Linux Mailing List

[Sent this earlier, but it doesn't seem to have shown up yet. My outgoing 
email server seems to flake out at times. Sorry if this is a duplicate, but 
it seemed important enough to resend, since we'd like to avoid the extra 
compile failure.]


On Thursday 27 February 2003 10:25, Roland Dreier wrote:
>    > +         char *name = kmalloc(DM_NAME_LEN + strlen(DM_DIR) + 1);
>    > +         if (!name) {
>    > +                 return -ENOMEM;
>    > +         }
>
> Also, kmalloc() needs a second "GFP_xxx" parameter (I guess GFP_KERNEL
> in this case, although I don't know the context this function is
> called from).
>
>  - Roland


Dammit! I'm not having a good morning. :(

Unfortunately, Linus seems to have committed that patch already. So here is a 
patch to fix just that line.

Thanks for catching that.

-- 
Kevin Corry
corryk@us.ibm.com
http://evms.sourceforge.net/


--- a/drivers/md/dm-ioctl.c	2003/02/27 16:29:58
+++ b/drivers/md/dm-ioctl.c	2003/02/27 17:21:54
@@ -174,7 +174,7 @@
 static int register_with_devfs(struct hash_cell *hc)
 {
 	struct gendisk *disk = dm_disk(hc->md);
-	char *name = kmalloc(DM_NAME_LEN + strlen(DM_DIR) + 1);
+	char *name = kmalloc(DM_NAME_LEN + strlen(DM_DIR) + 1, GFP_KERNEL);
 	if (!name) {
 		return -ENOMEM;
 	}

^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: [PATCH 3/8] dm: prevent possible buffer overflow in ioctl interface
       [not found] <OF06EBF3D5.39937A14-ON87256CDB.004FD627@us.ibm.com>
@ 2003-02-28 14:59 ` Kevin Corry
  2003-02-28 18:14   ` Horst von Brand
  0 siblings, 1 reply; 10+ messages in thread
From: Kevin Corry @ 2003-02-28 14:59 UTC (permalink / raw)
  To: Joe Perches, LKML; +Cc: Linus Torvalds, Joe Thornber

On Friday 28 February 2003 08:32, you wrote:
> On Thu, 2003-02-27 at 14:05, Kevin Corry wrote:
> > Unfortunately, Linus seems to have committed that patch already. So here
> > is a patch to fix just that line.
> >
> > Thanks for catching that.
>
> Third time, strlen isn't necessary, it can be done at compile time.
>
> --- a/drivers/md/dm-ioctl.c     2003/02/27 16:29:58
> +++ b/drivers/md/dm-ioctl.c     2003/02/27 17:21:54
> @@ -174,7 +174,7 @@
>  static int register_with_devfs(struct hash_cell *hc)
>  {
>         struct gendisk *disk = dm_disk(hc->md);
> -       char *name = kmalloc(DM_NAME_LEN + strlen(DM_DIR) + 1);
> +       char *name = kmalloc(DM_NAME_LEN + sizeof(DM_DIR));
>         if (!name) {
>                 return -ENOMEM;
>         }

Sorry, I sent the last patch before I got your email.

Also, the "+1" is still necessary, even if we switch to sizeof. The sprintf 
call that follows copies DM_DIR, followed by a slash, followed by the name 
from the hash table into the allocated string. The "+1" is for the slash in 
the middle. The terminating NULL character is accounted for in DM_NAME_LEN.

Linus, here is (yet another!) patch against current BK.

-- 
Kevin Corry
corryk@us.ibm.com
http://evms.sourceforge.net/


--- linux-2.5.63-bk4a/drivers/md/dm-ioctl.c	Fri Feb 28 08:43:19 2003
+++ linux-2.5.63-bk4b/drivers/md/dm-ioctl.c	Fri Feb 28 08:44:08 2003
@@ -174,7 +174,7 @@
 static int register_with_devfs(struct hash_cell *hc)
 {
 	struct gendisk *disk = dm_disk(hc->md);
-	char *name = kmalloc(DM_NAME_LEN + strlen(DM_DIR) + 1, GFP_KERNEL);
+	char *name = kmalloc(DM_NAME_LEN + sizeof(DM_DIR) + 1, GFP_KERNEL);
 	if (!name) {
 		return -ENOMEM;
 	}

^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: [PATCH 3/8] dm: prevent possible buffer overflow in ioctl interface
  2003-02-28 14:59 ` [PATCH 3/8] dm: prevent possible buffer overflow in ioctl interface Kevin Corry
@ 2003-02-28 18:14   ` Horst von Brand
  2003-02-28 18:31     ` Kevin Corry
  0 siblings, 1 reply; 10+ messages in thread
From: Horst von Brand @ 2003-02-28 18:14 UTC (permalink / raw)
  To: Kevin Corry; +Cc: Joe Perches, LKML, Linus Torvalds, Joe Thornber

Kevin Corry <corryk@us.ibm.com> said:
> On Friday 28 February 2003 08:32, you wrote:
> > On Thu, 2003-02-27 at 14:05, Kevin Corry wrote:
> > > Unfortunately, Linus seems to have committed that patch already. So here
> > > is a patch to fix just that line.
> > >
> > > Thanks for catching that.
> >
> > Third time, strlen isn't necessary, it can be done at compile time.
> >
> > --- a/drivers/md/dm-ioctl.c     2003/02/27 16:29:58
> > +++ b/drivers/md/dm-ioctl.c     2003/02/27 17:21:54
> > @@ -174,7 +174,7 @@
> >  static int register_with_devfs(struct hash_cell *hc)
> >  {
> >         struct gendisk *disk = dm_disk(hc->md);
> > -       char *name = kmalloc(DM_NAME_LEN + strlen(DM_DIR) + 1);
> > +       char *name = kmalloc(DM_NAME_LEN + sizeof(DM_DIR));
> >         if (!name) {
> >                 return -ENOMEM;
> >         }
> 
> Sorry, I sent the last patch before I got your email.
> 
> Also, the "+1" is still necessary, even if we switch to sizeof. The sprintf 
> call that follows copies DM_DIR, followed by a slash, followed by the name 
> from the hash table into the allocated string. The "+1" is for the slash in 
> the middle. The terminating NULL character is accounted for in
> DM_NAME_LEN.

Then it was broken before.

sizeof("1234") == strlen("1234") + 1 == 5

^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: [PATCH 3/8] dm: prevent possible buffer overflow in ioctl interface
  2003-02-28 18:14   ` Horst von Brand
@ 2003-02-28 18:31     ` Kevin Corry
  0 siblings, 0 replies; 10+ messages in thread
From: Kevin Corry @ 2003-02-28 18:31 UTC (permalink / raw)
  To: Horst von Brand; +Cc: Joe Perches, LKML, Linus Torvalds, Joe Thornber

On Friday 28 February 2003 12:14, Horst von Brand wrote:
> Kevin Corry <corryk@us.ibm.com> said:
> > Also, the "+1" is still necessary, even if we switch to sizeof. The
> > sprintf call that follows copies DM_DIR, followed by a slash, followed by
> > the name from the hash table into the allocated string. The "+1" is for
> > the slash in the middle. The terminating NULL character is accounted for
> > in
> > DM_NAME_LEN.
>
> Then it was broken before.
>
> sizeof("1234") == strlen("1234") + 1 == 5

Hmmm...wasn't aware of that. I guess I never expected there to be a 
difference. If that's the case, then Joe Perches' earlier patch should do the 
trick, albiet for obscure reasons.

And I wouldn't say it was broken the other way; it was simply allocating one 
byte more than necessary.

-- 
Kevin Corry
corryk@us.ibm.com
http://evms.sourceforge.net/

^ permalink raw reply	[flat|nested] 10+ messages in thread

end of thread, other threads:[~2003-02-28 18:25 UTC | newest]

Thread overview: 10+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
     [not found] <OF06EBF3D5.39937A14-ON87256CDB.004FD627@us.ibm.com>
2003-02-28 14:59 ` [PATCH 3/8] dm: prevent possible buffer overflow in ioctl interface Kevin Corry
2003-02-28 18:14   ` Horst von Brand
2003-02-28 18:31     ` Kevin Corry
2003-02-26 17:05 device-mapper patchset 2.5.63-dm-1 Joe Thornber
2003-02-26 17:09 ` [PATCH 3/8] dm: prevent possible buffer overflow in ioctl interface Joe Thornber
2003-02-26 21:04   ` Horst von Brand
2003-02-27 14:20     ` Kevin Corry
2003-02-27 14:36       ` Kevin Corry
2003-02-27 16:25         ` Roland Dreier
2003-02-27 16:34           ` Kevin Corry
2003-02-27 22:05           ` Kevin Corry

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox