diff options
author | Chandra Seetharaman <sekharan@us.ibm.com> | 2006-10-10 18:15:55 -0400 |
---|---|---|
committer | Mark Fasheh <mark.fasheh@oracle.com> | 2006-10-20 18:29:00 -0400 |
commit | 559c9ac391c046710bdeee5581dc5d9dda794881 (patch) | |
tree | 78cdf1ebc1027028b7e1e01d4ed34f2cf18742c9 /fs | |
parent | e2057c5a63821e17c8a54dab6db680c77ce7ee6c (diff) |
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>
Diffstat (limited to 'fs')
-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 e6d5754a715e..cf33fac68c84 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) | |||
275 | * it in file->private_data for easy access. | 275 | * it in file->private_data for easy access. |
276 | */ | 276 | */ |
277 | buffer = kzalloc(sizeof(struct configfs_buffer),GFP_KERNEL); | 277 | buffer = kzalloc(sizeof(struct configfs_buffer),GFP_KERNEL); |
278 | if (buffer) { | 278 | if (!buffer) { |
279 | init_MUTEX(&buffer->sem); | ||
280 | buffer->needs_read_fill = 1; | ||
281 | buffer->ops = ops; | ||
282 | file->private_data = buffer; | ||
283 | } else | ||
284 | error = -ENOMEM; | 279 | error = -ENOMEM; |
280 | goto Enomem; | ||
281 | } | ||
282 | init_MUTEX(&buffer->sem); | ||
283 | buffer->needs_read_fill = 1; | ||
284 | buffer->ops = ops; | ||
285 | file->private_data = buffer; | ||
285 | goto Done; | 286 | goto Done; |
286 | 287 | ||
287 | Einval: | 288 | Einval: |
@@ -289,6 +290,7 @@ static int check_perm(struct inode * inode, struct file * file) | |||
289 | goto Done; | 290 | goto Done; |
290 | Eaccess: | 291 | Eaccess: |
291 | error = -EACCES; | 292 | error = -EACCES; |
293 | Enomem: | ||
292 | module_put(attr->ca_owner); | 294 | module_put(attr->ca_owner); |
293 | Done: | 295 | Done: |
294 | if (error && item) | 296 | if (error && item) |