Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]


Groups > linux.kernel > #1493626 > unrolled thread

[PATCH] dmaengine: coh901318: fix integer overflow when shifting more than 32 places

Started byColin King <colin.king@canonical.com>
First post2016-09-29 20:00 +0200
Last post2016-10-04 18:10 +0200
Articles 5 — 4 participants

Back to article view | Back to linux.kernel


Contents

  [PATCH] dmaengine: coh901318: fix integer overflow when shifting more than 32 places Colin King <colin.king@canonical.com> - 2016-09-29 20:00 +0200
    Re: [PATCH] dmaengine: coh901318: fix integer overflow when  shifting more than 32 places Joe Perches <joe@perches.com> - 2016-09-29 20:10 +0200
      Re: [PATCH] dmaengine: coh901318: fix integer overflow when shifting  more than 32 places Linus Walleij <linus.walleij@linaro.org> - 2016-10-04 14:30 +0200
        Re: [PATCH] dmaengine: coh901318: fix integer overflow when shifting  more than 32 places Vinod Koul <vinod.koul@intel.com> - 2016-10-04 17:30 +0200
          Re: [PATCH] dmaengine: coh901318: fix integer overflow when  shifting more than 32 places Joe Perches <joe@perches.com> - 2016-10-04 18:10 +0200

#1493626 — [PATCH] dmaengine: coh901318: fix integer overflow when shifting more than 32 places

FromColin King <colin.king@canonical.com>
Date2016-09-29 20:00 +0200
Subject[PATCH] dmaengine: coh901318: fix integer overflow when shifting more than 32 places
Message-ID<smNMJ-7br-9@gated-at.bofh.it>
From: Colin Ian King <colin.king@canonical.com>

Currently U300_DMA_CHANNELS is set to 40, meaning that the shift of 1 can
be more than 32 places, which leads to a 32 bit integer overflow. Fix this
by casting 1 to a u64 (the same type as started_channels) before shifting
it.

Signed-off-by: Colin Ian King <colin.king@canonical.com>
---
 drivers/dma/coh901318.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/drivers/dma/coh901318.c b/drivers/dma/coh901318.c
index 2835f3e..98611e3 100644
--- a/drivers/dma/coh901318.c
+++ b/drivers/dma/coh901318.c
@@ -1353,7 +1353,7 @@ static ssize_t coh901318_debugfs_read(struct file *file, char __user *buf,
 	tmp += sprintf(tmp, "DMA -- enabled dma channels\n");
 
 	for (i = 0; i < U300_DMA_CHANNELS; i++)
-		if (started_channels & (1 << i))
+		if (started_channels & ((u64)1 << i))
 			tmp += sprintf(tmp, "channel %d\n", i);
 
 	tmp += sprintf(tmp, "Pool alloc nbr %d\n", pool_count);
-- 
2.9.3

[toc] | [next] | [standalone]


#1493629 — Re: [PATCH] dmaengine: coh901318: fix integer overflow when shifting more than 32 places

FromJoe Perches <joe@perches.com>
Date2016-09-29 20:10 +0200
SubjectRe: [PATCH] dmaengine: coh901318: fix integer overflow when shifting more than 32 places
Message-ID<smNWp-7uF-1@gated-at.bofh.it>
In reply to#1493626
On Thu, 2016-09-29 at 18:57 +0100, Colin King wrote:
> Currently U300_DMA_CHANNELS is set to 40, meaning that the shift of 1 can
> be more than 32 places, which leads to a 32 bit integer overflow. Fix this
> by casting 1 to a u64 (the same type as started_channels) before shifting
> it.

trivia:

> diff --git a/drivers/dma/coh901318.c b/drivers/dma/coh901318.c
[]
> @@ -1353,7 +1353,7 @@ static ssize_t coh901318_debugfs_read(struct file *file, char __user *buf,
>  	tmp += sprintf(tmp, "DMA -- enabled dma channels\n");
>  
>  	for (i = 0; i < U300_DMA_CHANNELS; i++)
> -		if (started_channels & (1 << i))
> +		if (started_channels & ((u64)1 << i))

Using

		if (started_channels & (1ULL << i))

would be more common.

It's also how started_channel bits are set and cleared later in the file.

And maybe the for loop should use braces.

[toc] | [prev] | [next] | [standalone]


#1495400 — Re: [PATCH] dmaengine: coh901318: fix integer overflow when shifting more than 32 places

FromLinus Walleij <linus.walleij@linaro.org>
Date2016-10-04 14:30 +0200
SubjectRe: [PATCH] dmaengine: coh901318: fix integer overflow when shifting more than 32 places
Message-ID<sox17-2F6-9@gated-at.bofh.it>
In reply to#1493629
On Thu, Sep 29, 2016 at 8:06 PM, Joe Perches <joe@perches.com> wrote:
> On Thu, 2016-09-29 at 18:57 +0100, Colin King wrote:
>> Currently U300_DMA_CHANNELS is set to 40, meaning that the shift of 1 can
>> be more than 32 places, which leads to a 32 bit integer overflow. Fix this
>> by casting 1 to a u64 (the same type as started_channels) before shifting
>> it.
>
> trivia:
>
>> diff --git a/drivers/dma/coh901318.c b/drivers/dma/coh901318.c
> []
>> @@ -1353,7 +1353,7 @@ static ssize_t coh901318_debugfs_read(struct file *file, char __user *buf,
>>       tmp += sprintf(tmp, "DMA -- enabled dma channels\n");
>>
>>       for (i = 0; i < U300_DMA_CHANNELS; i++)
>> -             if (started_channels & (1 << i))
>> +             if (started_channels & ((u64)1 << i))
>
> Using
>
>                 if (started_channels & (1ULL << i))
>
> would be more common.

Even better (IMO):

#include <linux/bitops.h>

if (started_channels & BIT(i))

Apparently code is there to avoid the bit 31 problem, mea culpa.

Yours,
Linus Walleij

[toc] | [prev] | [next] | [standalone]


#1495476 — Re: [PATCH] dmaengine: coh901318: fix integer overflow when shifting more than 32 places

FromVinod Koul <vinod.koul@intel.com>
Date2016-10-04 17:30 +0200
SubjectRe: [PATCH] dmaengine: coh901318: fix integer overflow when shifting more than 32 places
Message-ID<sozPj-4AX-13@gated-at.bofh.it>
In reply to#1495400
On Tue, Oct 04, 2016 at 02:23:51PM +0200, Linus Walleij wrote:
> On Thu, Sep 29, 2016 at 8:06 PM, Joe Perches <joe@perches.com> wrote:
> > On Thu, 2016-09-29 at 18:57 +0100, Colin King wrote:
> >> Currently U300_DMA_CHANNELS is set to 40, meaning that the shift of 1 can
> >> be more than 32 places, which leads to a 32 bit integer overflow. Fix this
> >> by casting 1 to a u64 (the same type as started_channels) before shifting
> >> it.
> >
> > trivia:
> >
> >> diff --git a/drivers/dma/coh901318.c b/drivers/dma/coh901318.c
> > []
> >> @@ -1353,7 +1353,7 @@ static ssize_t coh901318_debugfs_read(struct file *file, char __user *buf,
> >>       tmp += sprintf(tmp, "DMA -- enabled dma channels\n");
> >>
> >>       for (i = 0; i < U300_DMA_CHANNELS; i++)
> >> -             if (started_channels & (1 << i))
> >> +             if (started_channels & ((u64)1 << i))
> >
> > Using
> >
> >                 if (started_channels & (1ULL << i))
> >
> > would be more common.
> 
> Even better (IMO):
> 
> #include <linux/bitops.h>
> 
> if (started_channels & BIT(i))
> 
> Apparently code is there to avoid the bit 31 problem, mea culpa.

I have already applied this one, so feel free to send this as an update :)

-- 
~Vinod

[toc] | [prev] | [next] | [standalone]


#1495494 — Re: [PATCH] dmaengine: coh901318: fix integer overflow when shifting more than 32 places

FromJoe Perches <joe@perches.com>
Date2016-10-04 18:10 +0200
SubjectRe: [PATCH] dmaengine: coh901318: fix integer overflow when shifting more than 32 places
Message-ID<soAs2-53L-1@gated-at.bofh.it>
In reply to#1495476
On Tue, 2016-10-04 at 21:06 +0530, Vinod Koul wrote:
> On Tue, Oct 04, 2016 at 02:23:51PM +0200, Linus Walleij wrote:
> > On Thu, Sep 29, 2016 at 8:06 PM, Joe Perches <joe@perches.com> wrote:
> > > On Thu, 2016-09-29 at 18:57 +0100, Colin King wrote:
> > > > Currently U300_DMA_CHANNELS is set to 40, meaning that the shift of 1 can
> > > > be more than 32 places, which leads to a 32 bit integer overflow. Fix this
> > > > by casting 1 to a u64 (the same type as started_channels) before shifting
> > > > it.
> > > trivia:
> > > > diff --git a/drivers/dma/coh901318.c b/drivers/dma/coh901318.c
> > > []
> > > > @@ -1353,7 +1353,7 @@ static ssize_t coh901318_debugfs_read(struct file *file, char __user *buf,
> > > >       tmp += sprintf(tmp, "DMA -- enabled dma channels\n");
> > > > 
> > > >       for (i = 0; i < U300_DMA_CHANNELS; i++)
> > > > -             if (started_channels & (1 << i))
> > > > +             if (started_channels & ((u64)1 << i))
> > > Using
> > >                 if (started_channels & (1ULL << i))
> > > would be more common.
> > Even better (IMO):
> > #include <linux/bitops.h>
> > if (started_channels & BIT(i))
> > Apparently code is there to avoid the bit 31 problem, mea culpa.
> I have already applied this one, so feel free to send this as an update :)

BIT_ULL as it still needs to be u64 not unsigned long.

But if a change is really desired, please use it
consistently in the entire file and not just this
instance.

[toc] | [prev] | [standalone]


Back to top | Article view | linux.kernel


csiph-web