diff options
| author | Randy Dunlap <randy.dunlap@verizon.net> | 2003-03-21 18:50:43 -0800 |
|---|---|---|
| committer | Greg Kroah-Hartman <greg@kroah.com> | 2003-03-21 18:50:43 -0800 |
| commit | 45a522edc2be52a8a507d2a54ff83fdf74112f9c (patch) | |
| tree | a627cec520c1675d52b4d87de4df2fbe8c7a3c94 | |
| parent | 0dab5c04c543e2ff44ebe2216571626778280779 (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.c | 22 |
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; } |
