Commit a3ed2a15 authored by André Goddard Rosa's avatar André Goddard Rosa Committed by Linus Torvalds

mqueue: fix kernel BUG caused by double free() on mq_open()

In case of aborting because we reach the maximum amount of memory which
can be allocated to message queues per user (RLIMIT_MSGQUEUE), we would
try to free the message area twice when bailing out: first by the error
handling code itself, and then later when cleaning up the inode through
delete_inode().
Signed-off-by: default avatarAndré Goddard Rosa <andre.goddard@gmail.com>
Cc: Alexey Dobriyan <adobriyan@gmail.com>
Cc: Al Viro <viro@zeniv.linux.org.uk>
Cc: <stable@kernel.org>
Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
parent de145b44
...@@ -158,7 +158,7 @@ static struct inode *mqueue_get_inode(struct super_block *sb, ...@@ -158,7 +158,7 @@ static struct inode *mqueue_get_inode(struct super_block *sb,
u->mq_bytes + mq_bytes > u->mq_bytes + mq_bytes >
task_rlimit(p, RLIMIT_MSGQUEUE)) { task_rlimit(p, RLIMIT_MSGQUEUE)) {
spin_unlock(&mq_lock); spin_unlock(&mq_lock);
kfree(info->messages); /* mqueue_delete_inode() releases info->messages */
goto out_inode; goto out_inode;
} }
u->mq_bytes += mq_bytes; u->mq_bytes += mq_bytes;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment