diff options
Diffstat (limited to 'ipc/mqueue.c')
| -rw-r--r-- | ipc/mqueue.c | 11 |
1 files changed, 9 insertions, 2 deletions
diff --git a/ipc/mqueue.c b/ipc/mqueue.c index 6e10a55a78c5..f8eba5e46c5a 100644 --- a/ipc/mqueue.c +++ b/ipc/mqueue.c | |||
| @@ -24,6 +24,7 @@ | |||
| 24 | #include <linux/mqueue.h> | 24 | #include <linux/mqueue.h> |
| 25 | #include <linux/msg.h> | 25 | #include <linux/msg.h> |
| 26 | #include <linux/skbuff.h> | 26 | #include <linux/skbuff.h> |
| 27 | #include <linux/vmalloc.h> | ||
| 27 | #include <linux/netlink.h> | 28 | #include <linux/netlink.h> |
| 28 | #include <linux/syscalls.h> | 29 | #include <linux/syscalls.h> |
| 29 | #include <linux/audit.h> | 30 | #include <linux/audit.h> |
| @@ -152,7 +153,10 @@ static struct inode *mqueue_get_inode(struct super_block *sb, | |||
| 152 | info->attr.mq_msgsize = attr->mq_msgsize; | 153 | info->attr.mq_msgsize = attr->mq_msgsize; |
| 153 | } | 154 | } |
| 154 | mq_msg_tblsz = info->attr.mq_maxmsg * sizeof(struct msg_msg *); | 155 | mq_msg_tblsz = info->attr.mq_maxmsg * sizeof(struct msg_msg *); |
| 155 | info->messages = kmalloc(mq_msg_tblsz, GFP_KERNEL); | 156 | if (mq_msg_tblsz > KMALLOC_MAX_SIZE) |
| 157 | info->messages = vmalloc(mq_msg_tblsz); | ||
| 158 | else | ||
| 159 | info->messages = kmalloc(mq_msg_tblsz, GFP_KERNEL); | ||
| 156 | if (!info->messages) | 160 | if (!info->messages) |
| 157 | goto out_inode; | 161 | goto out_inode; |
| 158 | 162 | ||
| @@ -262,7 +266,10 @@ static void mqueue_evict_inode(struct inode *inode) | |||
| 262 | spin_lock(&info->lock); | 266 | spin_lock(&info->lock); |
| 263 | for (i = 0; i < info->attr.mq_curmsgs; i++) | 267 | for (i = 0; i < info->attr.mq_curmsgs; i++) |
| 264 | free_msg(info->messages[i]); | 268 | free_msg(info->messages[i]); |
| 265 | kfree(info->messages); | 269 | if (info->attr.mq_maxmsg * sizeof(struct msg_msg *) > KMALLOC_MAX_SIZE) |
| 270 | vfree(info->messages); | ||
| 271 | else | ||
| 272 | kfree(info->messages); | ||
| 266 | spin_unlock(&info->lock); | 273 | spin_unlock(&info->lock); |
| 267 | 274 | ||
| 268 | /* Total amount of bytes accounted for the mqueue */ | 275 | /* Total amount of bytes accounted for the mqueue */ |
