diff options
author | André Goddard Rosa <andre.goddard@gmail.com> | 2010-02-23 02:04:28 -0500 |
---|---|---|
committer | Al Viro <viro@zeniv.linux.org.uk> | 2010-03-03 14:46:05 -0500 |
commit | 4294a8eedb17bbc45e1e7447c2a4d05332943248 (patch) | |
tree | db83b372de61b43208e08a97dd5f0280552d7ffa | |
parent | 4919c5e45a91b5db5a41695fe0357fbdff0d5767 (diff) |
mqueue: fix mq_open() file descriptor leak on user-space processes
We leak fd on lookup_one_len() failure
Signed-off-by: André Goddard Rosa <andre.goddard@gmail.com>
Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
-rw-r--r-- | ipc/mqueue.c | 3 |
1 files changed, 1 insertions, 2 deletions
diff --git a/ipc/mqueue.c b/ipc/mqueue.c index c79bd57353e7..04985a7256c2 100644 --- a/ipc/mqueue.c +++ b/ipc/mqueue.c | |||
@@ -705,7 +705,7 @@ SYSCALL_DEFINE4(mq_open, const char __user *, u_name, int, oflag, mode_t, mode, | |||
705 | dentry = lookup_one_len(name, ipc_ns->mq_mnt->mnt_root, strlen(name)); | 705 | dentry = lookup_one_len(name, ipc_ns->mq_mnt->mnt_root, strlen(name)); |
706 | if (IS_ERR(dentry)) { | 706 | if (IS_ERR(dentry)) { |
707 | error = PTR_ERR(dentry); | 707 | error = PTR_ERR(dentry); |
708 | goto out_err; | 708 | goto out_putfd; |
709 | } | 709 | } |
710 | mntget(ipc_ns->mq_mnt); | 710 | mntget(ipc_ns->mq_mnt); |
711 | 711 | ||
@@ -742,7 +742,6 @@ out: | |||
742 | mntput(ipc_ns->mq_mnt); | 742 | mntput(ipc_ns->mq_mnt); |
743 | out_putfd: | 743 | out_putfd: |
744 | put_unused_fd(fd); | 744 | put_unused_fd(fd); |
745 | out_err: | ||
746 | fd = error; | 745 | fd = error; |
747 | out_upsem: | 746 | out_upsem: |
748 | mutex_unlock(&ipc_ns->mq_mnt->mnt_root->d_inode->i_mutex); | 747 | mutex_unlock(&ipc_ns->mq_mnt->mnt_root->d_inode->i_mutex); |