diff options
author | Chandra Seetharaman <sekharan@us.ibm.com> | 2006-10-10 15:15:55 -0700 |
---|---|---|
committer | Mark Fasheh <mark.fasheh@oracle.com> | 2006-10-20 15:29:00 -0700 |
commit | 559c9ac391c046710bdeee5581dc5d9dda794881 (patch) | |
tree | 78cdf1ebc1027028b7e1e01d4ed34f2cf18742c9 | |
parent | e2057c5a63821e17c8a54dab6db680c77ce7ee6c (diff) | |
download | linux-3.10-559c9ac391c046710bdeee5581dc5d9dda794881.tar.gz linux-3.10-559c9ac391c046710bdeee5581dc5d9dda794881.tar.bz2 linux-3.10-559c9ac391c046710bdeee5581dc5d9dda794881.zip |
configfs: handle kzalloc() failure in check_perm()
check_perm() does not drop the reference to the module when kzalloc()
failure occurs.
Signed-Off-By: Chandra Seetharaman <sekharan@us.ibm.com>
Signed-off-by: Joel Becker <joel.becker@oracle.com>
Signed-off-by: Mark Fasheh <mark.fasheh@oracle.com>
-rw-r--r-- | fs/configfs/file.c | 14 |
1 files changed, 8 insertions, 6 deletions
diff --git a/fs/configfs/file.c b/fs/configfs/file.c index e6d5754a715..cf33fac68c8 100644 --- a/fs/configfs/file.c +++ b/fs/configfs/file.c @@ -275,13 +275,14 @@ static int check_perm(struct inode * inode, struct file * file) * it in file->private_data for easy access. */ buffer = kzalloc(sizeof(struct configfs_buffer),GFP_KERNEL); - if (buffer) { - init_MUTEX(&buffer->sem); - buffer->needs_read_fill = 1; - buffer->ops = ops; - file->private_data = buffer; - } else + if (!buffer) { error = -ENOMEM; + goto Enomem; + } + init_MUTEX(&buffer->sem); + buffer->needs_read_fill = 1; + buffer->ops = ops; + file->private_data = buffer; goto Done; Einval: @@ -289,6 +290,7 @@ static int check_perm(struct inode * inode, struct file * file) goto Done; Eaccess: error = -EACCES; + Enomem: module_put(attr->ca_owner); Done: if (error && item) |