From: Chris Wright <chrisw@osdl.org>
To: linux-kernel@vger.kernel.org
Cc: akpm@osdl.org, torvalds@osdl.org, marcelo.tosatti@cyclades.com
Subject: [PATCH 10/11] enforce rlimits for POSIX mqueue allocation
Date: Tue, 11 May 2004 02:02:53 -0700 [thread overview]
Message-ID: <20040511020252.I21045@build.pdx.osdl.net> (raw)
In-Reply-To: <20040511020002.H21045@build.pdx.osdl.net>; from chrisw@osdl.org on Tue, May 11, 2004 at 02:00:02AM -0700
Add a user_struct to the mq_inode_info structure. Charge the maximum
number of bytes that could be allocated to a mqueue to the user who
creates the mqueue. This is checked against the per user rlimit.
--- 2.6-rlimit/ipc/mqueue.c~mqueue_rlimit 2004-05-10 22:28:43.137833864 -0700
+++ 2.6-rlimit/ipc/mqueue.c 2004-05-10 22:30:44.530379392 -0700
@@ -67,6 +66,7 @@
struct sigevent notify;
pid_t notify_owner;
+ struct user_struct *user; /* user who created, for accouting */
struct sock *notify_sock;
struct sk_buff *notify_cookie;
@@ -114,6 +114,9 @@
if (S_ISREG(mode)) {
struct mqueue_inode_info *info;
+ struct task_struct *p = current;
+ struct user_struct *u = p->user;
+ unsigned long mq_bytes, mq_msg_tblsz;
inode->i_fop = &mqueue_file_operations;
inode->i_size = FILENT_SIZE;
@@ -123,8 +126,10 @@
init_waitqueue_head(&info->wait_q);
INIT_LIST_HEAD(&info->e_wait_q[0].list);
INIT_LIST_HEAD(&info->e_wait_q[1].list);
+ info->messages = NULL;
info->notify_owner = 0;
info->qsize = 0;
+ info->user = NULL; /* set when all is ok */
memset(&info->attr, 0, sizeof(info->attr));
info->attr.mq_maxmsg = DFLT_MSGMAX;
info->attr.mq_msgsize = DFLT_MSGSIZEMAX;
@@ -132,12 +137,29 @@
info->attr.mq_maxmsg = attr->mq_maxmsg;
info->attr.mq_msgsize = attr->mq_msgsize;
}
- info->messages = kmalloc(info->attr.mq_maxmsg * sizeof(struct msg_msg *), GFP_KERNEL);
+ mq_msg_tblsz = info->attr.mq_maxmsg * sizeof(struct msg_msg *);
+ mq_bytes = (mq_msg_tblsz +
+ (info->attr.mq_maxmsg * info->attr.mq_msgsize));
+
+ spin_lock(&mq_lock);
+ if (u->mq_bytes + mq_bytes < u->mq_bytes ||
+ u->mq_bytes + mq_bytes >
+ p->rlim[RLIMIT_MSGQUEUE].rlim_cur) {
+ spin_unlock(&mq_lock);
+ goto out_inode;
+ }
+ u->mq_bytes += mq_bytes;
+ spin_unlock(&mq_lock);
+
+ info->messages = kmalloc(mq_msg_tblsz, GFP_KERNEL);
if (!info->messages) {
- make_bad_inode(inode);
- iput(inode);
- inode = NULL;
+ spin_lock(&mq_lock);
+ u->mq_bytes -= mq_bytes;
+ spin_unlock(&mq_lock);
+ goto out_inode;
}
+ /* all is ok */
+ info->user = get_uid(u);
} else if (S_ISDIR(mode)) {
inode->i_nlink++;
/* Some things misbehave if size == 0 on a directory */
@@ -147,6 +169,10 @@
}
}
return inode;
+out_inode:
+ make_bad_inode(inode);
+ iput(inode);
+ return NULL;
}
static int mqueue_fill_super(struct super_block *sb, void *data, int silent)
@@ -205,6 +231,8 @@
static void mqueue_delete_inode(struct inode *inode)
{
struct mqueue_inode_info *info;
+ struct user_struct *user;
+ unsigned long mq_bytes;
int i;
if (S_ISDIR(inode->i_mode)) {
@@ -220,10 +248,15 @@
clear_inode(inode);
- if (info->messages) {
+ mq_bytes = (info->attr.mq_maxmsg * sizeof(struct msg_msg *) +
+ (info->attr.mq_maxmsg * info->attr.mq_msgsize));
+ user = info->user;
+ if (user) {
spin_lock(&mq_lock);
+ user->mq_bytes -= mq_bytes;
queues_count--;
spin_unlock(&mq_lock);
+ free_uid(user);
}
}
next prev parent reply other threads:[~2004-05-11 9:16 UTC|newest]
Thread overview: 12+ messages / expand[flat|nested] mbox.gz Atom feed top
2004-05-11 8:42 [PATCH 0/11] rlimits for both queued signals and POSIX mqueues Chris Wright
2004-05-11 8:45 ` [PATCH 1/11] add rlimit entry for controlling queued signals Chris Wright
2004-05-11 8:46 ` [PATCH 2/11] add sigpending field to user_struct Chris Wright
2004-05-11 8:48 ` [PATCH 3/11] pass task_struct in send_signal() Chris Wright
2004-05-11 8:50 ` [PATCH 4/11] add simple get_uid() helper Chris Wright
2004-05-11 8:52 ` [PATCH 5/11] enforce rlimits on queued signals Chris Wright
2004-05-11 8:53 ` [PATCH 6/11] remove unused queued_signals global accounting Chris Wright
2004-05-11 8:56 ` [PATCH 7/11] add rlimit entry for POSIX mqueue allocation Chris Wright
2004-05-11 8:58 ` [PATCH 8/11] add mq_bytes to user_struct Chris Wright
2004-05-11 9:00 ` [PATCH 9/11] add mq_attr_ok() helper Chris Wright
2004-05-11 9:02 ` Chris Wright [this message]
2004-05-11 9:04 ` [PATCH 11/11] adjust default mqueue sizes Chris Wright
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20040511020252.I21045@build.pdx.osdl.net \
--to=chrisw@osdl.org \
--cc=akpm@osdl.org \
--cc=linux-kernel@vger.kernel.org \
--cc=marcelo.tosatti@cyclades.com \
--cc=torvalds@osdl.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox
all inboxes | Powered by JetHome®