* [PATCH 1/1] ASoC: Intel: Atom: add a missing star in a memcpy call
@ 2016-08-28 17:39 Nicolas Iooss
2016-08-28 17:50 ` Misuses of ** ? (was Re: [PATCH 1/1] ASoC: Intel: Atom: add a missing star in a memcpy call) Joe Perches
2016-08-28 18:17 ` [PATCH 1/1] ASoC: Intel: Atom: add a missing star in a memcpy call Joe Perches
0 siblings, 2 replies; 9+ messages in thread
From: Nicolas Iooss @ 2016-08-28 17:39 UTC (permalink / raw)
To: Liam Girdwood, Mark Brown, alsa-devel; +Cc: linux-kernel, Nicolas Iooss
In sst_prepare_and_post_msg(), when a response is received in "block",
the following code gets executed:
*data = kzalloc(block->size, GFP_KERNEL);
memcpy(data, (void *) block->data, block->size);
The memcpy() call overwrites the content of the *data pointer instead of
filling the newly-allocated memory (which pointer is hold by *data).
Fix this by using *data in the memcpy() call.
Fixes: 60dc8dbacb00 ("ASoC: Intel: sst: Add some helper functions")
Cc: stable@vger.kernel.org # 3.19.x
Signed-off-by: Nicolas Iooss <nicolas.iooss_linux@m4x.org>
---
sound/soc/intel/atom/sst/sst_pvt.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/sound/soc/intel/atom/sst/sst_pvt.c b/sound/soc/intel/atom/sst/sst_pvt.c
index adb32fefd693..7c398b7c9d4b 100644
--- a/sound/soc/intel/atom/sst/sst_pvt.c
+++ b/sound/soc/intel/atom/sst/sst_pvt.c
@@ -289,7 +289,7 @@ int sst_prepare_and_post_msg(struct intel_sst_drv *sst,
ret = -ENOMEM;
goto out;
} else
- memcpy(data, (void *) block->data, block->size);
+ memcpy(*data, (void *) block->data, block->size);
}
}
out:
--
2.9.3
^ permalink raw reply related [flat|nested] 9+ messages in thread* Misuses of ** ? (was Re: [PATCH 1/1] ASoC: Intel: Atom: add a missing star in a memcpy call) 2016-08-28 17:39 [PATCH 1/1] ASoC: Intel: Atom: add a missing star in a memcpy call Nicolas Iooss @ 2016-08-28 17:50 ` Joe Perches 2016-08-28 18:52 ` Nicolas Iooss 2016-08-28 18:17 ` [PATCH 1/1] ASoC: Intel: Atom: add a missing star in a memcpy call Joe Perches 1 sibling, 1 reply; 9+ messages in thread From: Joe Perches @ 2016-08-28 17:50 UTC (permalink / raw) To: Nicolas Iooss, Liam Girdwood, Mark Brown, alsa-devel, Julia Lawall, Dan Capenter Cc: linux-kernel On Sun, 2016-08-28 at 19:39 +0200, Nicolas Iooss wrote: > In sst_prepare_and_post_msg(), when a response is received in "block", > the following code gets executed: > > *data = kzalloc(block->size, GFP_KERNEL); > memcpy(data, (void *) block->data, block->size); Yuck, thanks. Julia, Dan, could cocci or smatch help find any other similar misuses here? ^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: Misuses of ** ? (was Re: [PATCH 1/1] ASoC: Intel: Atom: add a missing star in a memcpy call) 2016-08-28 17:50 ` Misuses of ** ? (was Re: [PATCH 1/1] ASoC: Intel: Atom: add a missing star in a memcpy call) Joe Perches @ 2016-08-28 18:52 ` Nicolas Iooss 2016-08-28 19:38 ` Julia Lawall 0 siblings, 1 reply; 9+ messages in thread From: Nicolas Iooss @ 2016-08-28 18:52 UTC (permalink / raw) To: Joe Perches, alsa-devel, Julia Lawall, Dan Capenter Cc: Liam Girdwood, Mark Brown, linux-kernel On 28/08/16 19:50, Joe Perches wrote: > On Sun, 2016-08-28 at 19:39 +0200, Nicolas Iooss wrote: >> In sst_prepare_and_post_msg(), when a response is received in "block", >> the following code gets executed: >> >> *data = kzalloc(block->size, GFP_KERNEL); >> memcpy(data, (void *) block->data, block->size); > > Yuck, thanks. > > Julia, Dan, could cocci or smatch help find any other > similar misuses here? In fact I have found this bug with a GCC plugin I have written after I discovered an issue with a printf format string in brcmfmac driver (https://lkml.org/lkml/2016/8/23/193 fixes this one). This GCC plugin uses an approach which has many false positives but it helped me detect real bugs such as the one you replied to, and https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/commit/?id=ae6c33ba6e37eea3012fe2640b22400ef3f2d0f3 a few days ago. In case you are curious about what the plugin looks like (it is very dirty but might be useful for future work I won't have time to do), I published it on https://gist.github.com/anonymous/36dd40dcbeeb83964e66b65be7a96136 . This huge patch contains the plugin code in scripts/gcc-plugins/deref_checker_plugin.c, many dirty work-arounds to filter false positive matches, a really-dirty way of handling memcpy optimisations done by gcc, and fixes to possible bugs (which can be found by searching "/* BUG? */", I have not yet had time to find out whether they are real bugs or false positives too). I hope this will help in the work of eliminating bugs in the kernel :) -- Nicolas ^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: Misuses of ** ? (was Re: [PATCH 1/1] ASoC: Intel: Atom: add a missing star in a memcpy call) 2016-08-28 18:52 ` Nicolas Iooss @ 2016-08-28 19:38 ` Julia Lawall 2016-08-28 20:34 ` Joe Perches 0 siblings, 1 reply; 9+ messages in thread From: Julia Lawall @ 2016-08-28 19:38 UTC (permalink / raw) To: Nicolas Iooss Cc: Joe Perches, alsa-devel, Dan Capenter, Liam Girdwood, Mark Brown, linux-kernel On Sun, 28 Aug 2016, Nicolas Iooss wrote: > On 28/08/16 19:50, Joe Perches wrote: > > On Sun, 2016-08-28 at 19:39 +0200, Nicolas Iooss wrote: > >> In sst_prepare_and_post_msg(), when a response is received in "block", > >> the following code gets executed: > >> > >> *data = kzalloc(block->size, GFP_KERNEL); > >> memcpy(data, (void *) block->data, block->size); > > > > Yuck, thanks. > > > > Julia, Dan, could cocci or smatch help find any other > > similar misuses here? > > In fact I have found this bug with a GCC plugin I have written after I > discovered an issue with a printf format string in brcmfmac driver > (https://lkml.org/lkml/2016/8/23/193 fixes this one). This GCC plugin > uses an approach which has many false positives but it helped me detect > real bugs such as the one you replied to, and > https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/commit/?id=ae6c33ba6e37eea3012fe2640b22400ef3f2d0f3 > a few days ago. > > In case you are curious about what the plugin looks like (it is very > dirty but might be useful for future work I won't have time to do), I > published it on > https://gist.github.com/anonymous/36dd40dcbeeb83964e66b65be7a96136 . > This huge patch contains the plugin code in > scripts/gcc-plugins/deref_checker_plugin.c, many dirty work-arounds to > filter false positive matches, a really-dirty way of handling memcpy > optimisations done by gcc, and fixes to possible bugs (which can be > found by searching "/* BUG? */", I have not yet had time to find out > whether they are real bugs or false positives too). > > I hope this will help in the work of eliminating bugs in the kernel :) I tried the following semantic patch, that is quite general, and the fixed issue was the only report. @@ expression x,y,sz; identifier f,g; @@ * *x = f(sz,...); ... * g(x,y,sz); julia ^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: Misuses of ** ? (was Re: [PATCH 1/1] ASoC: Intel: Atom: add a missing star in a memcpy call) 2016-08-28 19:38 ` Julia Lawall @ 2016-08-28 20:34 ` Joe Perches 2016-08-28 21:40 ` Julia Lawall 0 siblings, 1 reply; 9+ messages in thread From: Joe Perches @ 2016-08-28 20:34 UTC (permalink / raw) To: Julia Lawall, Nicolas Iooss Cc: alsa-devel, Dan Capenter, Liam Girdwood, Mark Brown, linux-kernel On Sun, 2016-08-28 at 21:38 +0200, Julia Lawall wrote: > On Sun, 28 Aug 2016, Nicolas Iooss wrote: > > On 28/08/16 19:50, Joe Perches wrote: > > > On Sun, 2016-08-28 at 19:39 +0200, Nicolas Iooss wrote: > > >> In sst_prepare_and_post_msg(), when a response is received in "block", > > >> the following code gets executed: > > >> > > >> *data = kzalloc(block->size, GFP_KERNEL); > > >> memcpy(data, (void *) block->data, block->size); > > > > > > Yuck, thanks. > > > > > > Julia, Dan, could cocci or smatch help find any other > > > similar misuses here? [] > I tried the following semantic patch, that is quite general, and the fixed > issue was the only report. > > @@ > expression x,y,sz; > identifier f,g; > @@ > > * *x = f(sz,...); > ... > * g(x,y,sz); Hi Julia, This would find exactly the same form, but I think the question is are there assignments of a **pp that should have been *pp Something like: @@ type P; P **pp; @@ * pp = <alloc>\|<copy>\|<access>(..., sizeof(P), ...) ^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: Misuses of ** ? (was Re: [PATCH 1/1] ASoC: Intel: Atom: add a missing star in a memcpy call) 2016-08-28 20:34 ` Joe Perches @ 2016-08-28 21:40 ` Julia Lawall 2016-08-28 21:54 ` Joe Perches 0 siblings, 1 reply; 9+ messages in thread From: Julia Lawall @ 2016-08-28 21:40 UTC (permalink / raw) To: Joe Perches Cc: Nicolas Iooss, alsa-devel, Dan Capenter, Liam Girdwood, Mark Brown, linux-kernel [-- Attachment #1: Type: TEXT/PLAIN, Size: 1268 bytes --] On Sun, 28 Aug 2016, Joe Perches wrote: > On Sun, 2016-08-28 at 21:38 +0200, Julia Lawall wrote: > > On Sun, 28 Aug 2016, Nicolas Iooss wrote: > > > On 28/08/16 19:50, Joe Perches wrote: > > > > On Sun, 2016-08-28 at 19:39 +0200, Nicolas Iooss wrote: > > > >> In sst_prepare_and_post_msg(), when a response is received in "block", > > > >> the following code gets executed: > > > >> > > > >> *data = kzalloc(block->size, GFP_KERNEL); > > > >> memcpy(data, (void *) block->data, block->size); > > > > > > > > Yuck, thanks. > > > > > > > > Julia, Dan, could cocci or smatch help find any other > > > > similar misuses here? > [] > > I tried the following semantic patch, that is quite general, and the fixed > > issue was the only report. > > > > @@ > > expression x,y,sz; > > identifier f,g; > > @@ > > > > * *x = f(sz,...); > > ... > > * g(x,y,sz); > > Hi Julia, > > This would find exactly the same form, but I think > the question is are there assignments of a **pp > that should have been *pp > > Something like: > > @@ > type P; > P **pp; > @@ > > * pp = <alloc>\|<copy>\|<access>(..., sizeof(P), ...) I didn't get anything for this. Did you mean for the left hand side of the assignment to be pp or *pp? Is the issue that the type is wrong? julia ^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: Misuses of ** ? (was Re: [PATCH 1/1] ASoC: Intel: Atom: add a missing star in a memcpy call) 2016-08-28 21:40 ` Julia Lawall @ 2016-08-28 21:54 ` Joe Perches 0 siblings, 0 replies; 9+ messages in thread From: Joe Perches @ 2016-08-28 21:54 UTC (permalink / raw) To: Julia Lawall Cc: Nicolas Iooss, alsa-devel, Dan Capenter, Liam Girdwood, Mark Brown, linux-kernel On Sun, 2016-08-28 at 23:40 +0200, Julia Lawall wrote: > On Sun, 28 Aug 2016, Joe Perches wrote: > > On Sun, 2016-08-28 at 21:38 +0200, Julia Lawall wrote: > > > On Sun, 28 Aug 2016, Nicolas Iooss wrote: > > > > On 28/08/16 19:50, Joe Perches wrote: > > > > > On Sun, 2016-08-28 at 19:39 +0200, Nicolas Iooss wrote: > > > > >> In sst_prepare_and_post_msg(), when a response is received in "block", > > > > >> the following code gets executed: > > > > >> > > > > >> *data = kzalloc(block->size, GFP_KERNEL); > > > > >> memcpy(data, (void *) block->data, block->size); > > > > > > > > > > Yuck, thanks. > > > > > > > > > > Julia, Dan, could cocci or smatch help find any other > > > > > similar misuses here? > > [] > > > I tried the following semantic patch, that is quite general, and the fixed > > > issue was the only report. > > > > > > @@ > > > expression x,y,sz; > > > identifier f,g; > > > @@ > > > > > > * *x = f(sz,...); > > > ... > > > * g(x,y,sz); > > > > Hi Julia, > > > > This would find exactly the same form, but I think > > the question is are there assignments of a **pp > > that should have been *pp > > > > Something like: > > > > @@ > > type P; > > P **pp; > > @@ > > > > * pp = \|\|(..., sizeof(P), ...) > I didn't get anything for this. Did you mean for the left hand side of > the assignment to be pp or *pp? Is the issue that the type is wrong? Yes, the issue here is the type may be wrong. A function passed a ** and assigned like: type function foo(type **bar) { ... bar = baz(); ... } bar is rarely correct and *bar is generally correct. I suppose the example would have been clearer with something - pp = foo; + *pp = foo; Also, any function that calls another function with implicit casts to void * from a specific type **pp after an assignment to *pp could be suspect. ^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [PATCH 1/1] ASoC: Intel: Atom: add a missing star in a memcpy call 2016-08-28 17:39 [PATCH 1/1] ASoC: Intel: Atom: add a missing star in a memcpy call Nicolas Iooss 2016-08-28 17:50 ` Misuses of ** ? (was Re: [PATCH 1/1] ASoC: Intel: Atom: add a missing star in a memcpy call) Joe Perches @ 2016-08-28 18:17 ` Joe Perches 2016-08-28 18:31 ` Nicolas Iooss 1 sibling, 1 reply; 9+ messages in thread From: Joe Perches @ 2016-08-28 18:17 UTC (permalink / raw) To: Nicolas Iooss, Liam Girdwood, Mark Brown, alsa-devel; +Cc: linux-kernel On Sun, 2016-08-28 at 19:39 +0200, Nicolas Iooss wrote: > In sst_prepare_and_post_msg(), when a response is received in "block", > the following code gets executed: > > *data = kzalloc(block->size, GFP_KERNEL); > memcpy(data, (void *) block->data, block->size); > > The memcpy() call overwrites the content of the *data pointer instead of > filling the newly-allocated memory (which pointer is hold by *data). > Fix this by using *data in the memcpy() call. > > Fixes: 60dc8dbacb00 ("ASoC: Intel: sst: Add some helper functions") > Cc: stable@vger.kernel.org # 3.19.x > Signed-off-by: Nicolas Iooss <nicolas.iooss_linux@m4x.org> > --- > sound/soc/intel/atom/sst/sst_pvt.c | 2 +- > 1 file changed, 1 insertion(+), 1 deletion(-) > > diff --git a/sound/soc/intel/atom/sst/sst_pvt.c b/sound/soc/intel/atom/sst/sst_pvt.c > index adb32fefd693..7c398b7c9d4b 100644 > --- a/sound/soc/intel/atom/sst/sst_pvt.c > +++ b/sound/soc/intel/atom/sst/sst_pvt.c > @@ -289,7 +289,7 @@ int sst_prepare_and_post_msg(struct intel_sst_drv *sst, > ret = -ENOMEM; > goto out; > } else > - memcpy(data, (void *) block->data, block->size); > + memcpy(*data, (void *) block->data, block->size); > } > } > out: Perhaps this would be nicer using kmemdup too --- sound/soc/intel/atom/sst/sst_pvt.c | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) diff --git a/sound/soc/intel/atom/sst/sst_pvt.c b/sound/soc/intel/atom/sst/sst_pvt.c index adb32fe..b1e6b8f 100644 --- a/sound/soc/intel/atom/sst/sst_pvt.c +++ b/sound/soc/intel/atom/sst/sst_pvt.c @@ -279,17 +279,15 @@ int sst_prepare_and_post_msg(struct intel_sst_drv *sst, if (response) { ret = sst_wait_timeout(sst, block); - if (ret < 0) { + if (ret < 0) goto out; - } else if(block->data) { - if (!data) - goto out; - *data = kzalloc(block->size, GFP_KERNEL); - if (!(*data)) { + + if (data && block->data) { + *data = kmemdup(block->data, block->size, GFP_KERNEL); + if (!*data) { ret = -ENOMEM; goto out; - } else - memcpy(data, (void *) block->data, block->size); + } } } out: ^ permalink raw reply related [flat|nested] 9+ messages in thread
* Re: [PATCH 1/1] ASoC: Intel: Atom: add a missing star in a memcpy call 2016-08-28 18:17 ` [PATCH 1/1] ASoC: Intel: Atom: add a missing star in a memcpy call Joe Perches @ 2016-08-28 18:31 ` Nicolas Iooss 0 siblings, 0 replies; 9+ messages in thread From: Nicolas Iooss @ 2016-08-28 18:31 UTC (permalink / raw) To: Joe Perches, Liam Girdwood, Mark Brown, alsa-devel; +Cc: linux-kernel On 28/08/16 20:17, Joe Perches wrote: > On Sun, 2016-08-28 at 19:39 +0200, Nicolas Iooss wrote: >> In sst_prepare_and_post_msg(), when a response is received in "block", >> the following code gets executed: >> >> *data = kzalloc(block->size, GFP_KERNEL); >> memcpy(data, (void *) block->data, block->size); >> >> The memcpy() call overwrites the content of the *data pointer instead of >> filling the newly-allocated memory (which pointer is hold by *data). >> Fix this by using *data in the memcpy() call. >> >> Fixes: 60dc8dbacb00 ("ASoC: Intel: sst: Add some helper functions") >> Cc: stable@vger.kernel.org # 3.19.x >> Signed-off-by: Nicolas Iooss <nicolas.iooss_linux@m4x.org> >> --- >> sound/soc/intel/atom/sst/sst_pvt.c | 2 +- >> 1 file changed, 1 insertion(+), 1 deletion(-) >> >> diff --git a/sound/soc/intel/atom/sst/sst_pvt.c b/sound/soc/intel/atom/sst/sst_pvt.c >> index adb32fefd693..7c398b7c9d4b 100644 >> --- a/sound/soc/intel/atom/sst/sst_pvt.c >> +++ b/sound/soc/intel/atom/sst/sst_pvt.c >> @@ -289,7 +289,7 @@ int sst_prepare_and_post_msg(struct intel_sst_drv *sst, >> ret = -ENOMEM; >> goto out; >> } else >> - memcpy(data, (void *) block->data, block->size); >> + memcpy(*data, (void *) block->data, block->size); >> } >> } >> out: > > Perhaps this would be nicer using kmemdup too Thanks for your quick reply! I agree using kmemdup looks nicer here and your patch looks good. I will send a v2 once I compile-tested it. Nicolas ^ permalink raw reply [flat|nested] 9+ messages in thread
end of thread, other threads:[~2016-08-28 21:54 UTC | newest] Thread overview: 9+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2016-08-28 17:39 [PATCH 1/1] ASoC: Intel: Atom: add a missing star in a memcpy call Nicolas Iooss 2016-08-28 17:50 ` Misuses of ** ? (was Re: [PATCH 1/1] ASoC: Intel: Atom: add a missing star in a memcpy call) Joe Perches 2016-08-28 18:52 ` Nicolas Iooss 2016-08-28 19:38 ` Julia Lawall 2016-08-28 20:34 ` Joe Perches 2016-08-28 21:40 ` Julia Lawall 2016-08-28 21:54 ` Joe Perches 2016-08-28 18:17 ` [PATCH 1/1] ASoC: Intel: Atom: add a missing star in a memcpy call Joe Perches 2016-08-28 18:31 ` Nicolas Iooss
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for NNTP newsgroup(s).