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(&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)))
-               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(&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)))
-               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

Reply via email to