summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRandy Dunlap <randy.dunlap@verizon.net>2003-03-21 18:50:43 -0800
committerGreg Kroah-Hartman <greg@kroah.com>2003-03-21 18:50:43 -0800
commit45a522edc2be52a8a507d2a54ff83fdf74112f9c (patch)
treea627cec520c1675d52b4d87de4df2fbe8c7a3c94
parent0dab5c04c543e2ff44ebe2216571626778280779 (diff)
[PATCH] reduce stack in cdrom/optcd.c
This reduces stack usage in drivers/cdrom/optcd.c by dynamically allocating a large (> 2 KB) buffer.
-rw-r--r--drivers/cdrom/optcd.c22
1 files changed, 17 insertions, 5 deletions
diff --git a/drivers/cdrom/optcd.c b/drivers/cdrom/optcd.c
index c7486e2f44f5..7ea5821af201 100644
--- a/drivers/cdrom/optcd.c
+++ b/drivers/cdrom/optcd.c
@@ -1600,13 +1600,17 @@ static int cdromsubchnl(unsigned long arg)
static int cdromread(unsigned long arg, int blocksize, int cmd)
{
- int status;
+ int status, ret = 0;
struct cdrom_msf msf;
- char buf[CD_FRAMESIZE_RAWER];
+ char *buf;
if (copy_from_user(&msf, (void *) arg, sizeof msf))
return -EFAULT;
+ buf = kmalloc(CD_FRAMESIZE_RAWER, GFP_KERNEL);
+ if (!buf)
+ return -ENOMEM;
+
bin2bcd(&msf);
msf.cdmsf_min1 = 0;
msf.cdmsf_sec1 = 0;
@@ -1615,11 +1619,19 @@ static int cdromread(unsigned long arg, int blocksize, int cmd)
DEBUG((DEBUG_VFS, "read cmd status 0x%x", status));
- if (!sleep_flag_low(FL_DTEN, SLEEP_TIMEOUT))
- return -EIO;
+ if (!sleep_flag_low(FL_DTEN, SLEEP_TIMEOUT)) {
+ ret = -EIO;
+ goto cdr_free;
+ }
+
fetch_data(buf, blocksize);
- return copy_to_user((void *)arg, &buf, blocksize) ? -EFAULT : 0;
+ if (copy_to_user((void *)arg, &buf, blocksize))
+ ret = -EFAULT;
+
+cdr_free:
+ kfree(buf);
+ return ret;
}