Update of /cvsroot/alsa/alsa-kernel/core
In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv17286
Modified Files:
pcm_native.c
Log Message:
Signed-off-by: Andrew Morton <[EMAIL PROTECTED]>
Each of snd_pcm_hw_refine_old_user() and snd_pcm_hw_params_old_user()
consume 856 bytes of stack and can invoke deep calls via the page allocator.
Index: pcm_native.c
===================================================================
RCS file: /cvsroot/alsa/alsa-kernel/core/pcm_native.c,v
retrieving revision 1.91
retrieving revision 1.92
diff -u -r1.91 -r1.92
--- pcm_native.c 22 May 2004 10:12:57 -0000 1.91
+++ pcm_native.c 1 Jun 2004 07:57:54 -0000 1.92
@@ -3125,31 +3125,68 @@
static int snd_pcm_hw_refine_old_user(snd_pcm_substream_t * substream, struct
sndrv_pcm_hw_params_old * _oparams)
{
- snd_pcm_hw_params_t params;
- struct sndrv_pcm_hw_params_old oparams;
+ snd_pcm_hw_params_t *params;
+ struct sndrv_pcm_hw_params_old *oparams = NULL;
int err;
- if (copy_from_user(&oparams, _oparams, sizeof(oparams)))
- return -EFAULT;
- snd_pcm_hw_convert_from_old_params(¶ms, &oparams);
- err = snd_pcm_hw_refine(substream, ¶ms);
- snd_pcm_hw_convert_to_old_params(&oparams, ¶ms);
- if (copy_to_user(_oparams, &oparams, sizeof(oparams)))
- return -EFAULT;
+
+ params = kmalloc(sizeof(*params), GFP_KERNEL);
+ if (!params) {
+ err = -ENOMEM;
+ goto out;
+ }
+ oparams = kmalloc(sizeof(*oparams), GFP_KERNEL);
+ if (!oparams) {
+ err = -ENOMEM;
+ goto out;
+ }
+
+ if (copy_from_user(oparams, _oparams, sizeof(*oparams))) {
+ err = -EFAULT;
+ goto out;
+ }
+ snd_pcm_hw_convert_from_old_params(params, oparams);
+ err = snd_pcm_hw_refine(substream, params);
+ snd_pcm_hw_convert_to_old_params(oparams, params);
+ if (copy_to_user(_oparams, oparams, sizeof(*oparams))) {
+ if (!err)
+ err = -EFAULT;
+ }
+out:
+ kfree(params);
+ kfree(oparams);
return err;
}
static int snd_pcm_hw_params_old_user(snd_pcm_substream_t * substream, struct
sndrv_pcm_hw_params_old * _oparams)
{
- snd_pcm_hw_params_t params;
- struct sndrv_pcm_hw_params_old oparams;
+ snd_pcm_hw_params_t *params;
+ struct sndrv_pcm_hw_params_old *oparams = NULL;
int err;
- if (copy_from_user(&oparams, _oparams, sizeof(oparams)))
- return -EFAULT;
- snd_pcm_hw_convert_from_old_params(¶ms, &oparams);
- err = snd_pcm_hw_params(substream, ¶ms);
- snd_pcm_hw_convert_to_old_params(&oparams, ¶ms);
- if (copy_to_user(_oparams, &oparams, sizeof(oparams)))
- return -EFAULT;
+
+ params = kmalloc(sizeof(*params), GFP_KERNEL);
+ if (!params) {
+ err = -ENOMEM;
+ goto out;
+ }
+ oparams = kmalloc(sizeof(*oparams), GFP_KERNEL);
+ if (!oparams) {
+ err = -ENOMEM;
+ goto out;
+ }
+ if (copy_from_user(oparams, _oparams, sizeof(*oparams))) {
+ err = -EFAULT;
+ goto out;
+ }
+ snd_pcm_hw_convert_from_old_params(params, oparams);
+ err = snd_pcm_hw_params(substream, params);
+ snd_pcm_hw_convert_to_old_params(oparams, params);
+ if (copy_to_user(_oparams, oparams, sizeof(*oparams))) {
+ if (!err)
+ err = -EFAULT;
+ }
+out:
+ kfree(params);
+ kfree(oparams);
return err;
}
-------------------------------------------------------
This SF.Net email is sponsored by: Oracle 10g
Get certified on the hottest thing ever to hit the market... Oracle 10g.
Take an Oracle 10g class now, and we'll give you the exam FREE.
http://ads.osdn.com/?ad_id=3149&alloc_id=8166&op=click
_______________________________________________
Alsa-cvslog mailing list
[EMAIL PROTECTED]
https://lists.sourceforge.net/lists/listinfo/alsa-cvslog