[PATCH] tpm: large stack objects
authorKylene Hall <kjhall@us.ibm.com>
Fri, 24 Jun 2005 05:01:54 +0000 (22:01 -0700)
committerLinus Torvalds <torvalds@ppc970.osdl.org>
Fri, 24 Jun 2005 07:05:25 +0000 (00:05 -0700)
Remove some large objects be declared on the the stack.

Signed-off-by: Kylene Hall <kjhall@us.ibm.com>
Signed-off-by: Andrew Morton <akpm@osdl.org>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>
drivers/char/tpm/tpm.c

index 7b1f67d9f301839835502964b8ba4793397613eb..2035c15ffcce70bfc038c8a5925257a1cb353f9c 100644 (file)
@@ -255,7 +255,7 @@ static const u8 readpubek[] = {
 
 static ssize_t show_pubek(struct device *dev, struct device_attribute *attr, char *buf)
 {
-       u8 data[READ_PUBEK_RESULT_SIZE];
+       u8 *data;
        ssize_t len;
        __be32 *native_val;
        int i;
@@ -266,12 +266,18 @@ static ssize_t show_pubek(struct device *dev, struct device_attribute *attr, cha
        if (chip == NULL)
                return -ENODEV;
 
+       data = kmalloc(READ_PUBEK_RESULT_SIZE, GFP_KERNEL);
+       if (!data)
+               return -ENOMEM;
+
        memcpy(data, readpubek, sizeof(readpubek));
        memset(data + sizeof(readpubek), 0, 20);        /* zero nonce */
 
-       if ((len = tpm_transmit(chip, data, sizeof(data))) <
-           READ_PUBEK_RESULT_SIZE)
-               return len;
+       if ((len = tpm_transmit(chip, data, READ_PUBEK_RESULT_SIZE)) <
+           READ_PUBEK_RESULT_SIZE) {
+               rc = len;
+               goto out;
+       }
 
        /* 
           ignore header 10 bytes
@@ -304,7 +310,10 @@ static ssize_t show_pubek(struct device *dev, struct device_attribute *attr, cha
                if ((i + 1) % 16 == 0)
                        str += sprintf(str, "\n");
        }
-       return str - buf;
+       rc = str - buf;
+out:
+       kfree(data);
+       return rc;
 }
 
 static DEVICE_ATTR(pubek, S_IRUGO, show_pubek, NULL);
@@ -330,7 +339,7 @@ static const u8 cap_manufacturer[] = {
 
 static ssize_t show_caps(struct device *dev, struct device_attribute *attr, char *buf)
 {
-       u8 data[READ_PUBEK_RESULT_SIZE];
+       u8 data[sizeof(cap_manufacturer)];
        ssize_t len;
        char *str = buf;