Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1755065AbbLQTfq (ORCPT ); Thu, 17 Dec 2015 14:35:46 -0500 Received: from mail-io0-f177.google.com ([209.85.223.177]:34193 "EHLO mail-io0-f177.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751832AbbLQTfp (ORCPT ); Thu, 17 Dec 2015 14:35:45 -0500 From: Fredrik Markstrom Cc: Fredrik Markstrom , Ingo Molnar , Peter Zijlstra , Davidlohr Bueso , Andrew Morton , Thomas Gleixner , Michael Kerrisk , Al Viro , David Howells , Marcus Gelderie , linux-kernel@vger.kernel.org Subject: [PATCH 1/1] ipc/mqueue: Obey RLIM_INFINITY for message queues. Date: Thu, 17 Dec 2015 20:32:13 +0100 Message-Id: <1450380763-8797-1-git-send-email-fredrik.markstrom@gmail.com> X-Mailer: git-send-email 2.1.4 To: unlisted-recipients:; (no To-header on input) Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 2648 Lines: 99 Even if we set the "POSIX message queues" rlimit to unlimited we fail with EMFILE if the sum kept per user wraps around after 4G. This patch fixes that by skipping the test and changing the type of user->mq_bytes to long long. The accounting wasn't skipped entierly if RLIM_INFINITY is that someone might change rlimit from unlimited to something smaller while we have the mq open. Signed-off-by: Fredrik Markstrom --- /* Compile with: gcc -o mqt mqt.c */ #include #include #include #include int main(void) { int i; mqd_t mqs[1000]; struct mq_attr attr; attr.mq_msgsize = 70000; attr.mq_maxmsg = 10000; attr.mq_flags = 0; attr.mq_curmsgs = 0; for(i = 0; i < 1000; i++) { char name[32]; sprintf(name, "/tmq%d", i); mqs[i] = mq_open(name, O_RDWR|O_CREAT, 0644, &attr); if(mqs[i] < 0) { printf("Failed after %d mq_open\n", i); perror("mq_open"); return -1; } } printf("Success (i=%d)\n", i); return 0; } Before patch: % ulimit -c unlimited % ./mqt Failed after 6 mq_open mq_open: Too many open files After patch: % ulimit -c unlimited % ./mqt .... Success (i=1000) include/linux/sched.h | 2 +- ipc/mqueue.c | 5 +++-- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/include/linux/sched.h b/include/linux/sched.h index edad7a4..745b7f5 100644 --- a/include/linux/sched.h +++ b/include/linux/sched.h @@ -827,7 +827,7 @@ struct user_struct { #endif #ifdef CONFIG_POSIX_MQUEUE /* protected by mq_lock */ - unsigned long mq_bytes; /* How many bytes can be allocated to mqueue? */ + unsigned long long mq_bytes; /* How many bytes can be allocated to mqueue? */ #endif unsigned long locked_shm; /* How many pages of mlocked shm ? */ diff --git a/ipc/mqueue.c b/ipc/mqueue.c index 161a180..40db042 100644 --- a/ipc/mqueue.c +++ b/ipc/mqueue.c @@ -275,8 +275,9 @@ static struct inode *mqueue_get_inode(struct super_block *sb, info->attr.mq_msgsize); spin_lock(&mq_lock); - if (u->mq_bytes + mq_bytes < u->mq_bytes || - u->mq_bytes + mq_bytes > rlimit(RLIMIT_MSGQUEUE)) { + if (rlimit(RLIMIT_MSGQUEUE) != RLIM_INFINITY && ( + u->mq_bytes + mq_bytes < u->mq_bytes || + u->mq_bytes + mq_bytes > rlimit(RLIMIT_MSGQUEUE))) { spin_unlock(&mq_lock); /* mqueue_evict_inode() releases info->messages */ ret = -EMFILE; -- 2.1.4 -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/