lkml.org 
[lkml]   [2007]   [Nov]   [16]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
Patch in this message
/
Date
From
SubjectRe: [RFC] [PATCH] hugetlbfs :shmget with SHM_HUGETLB only works as root
Hi  Adam,
If this condition check is not included, the root user have to use the
function
setrlimit() to set the lock_limit of a normal user to RLIM_INFINITY. I
think
the /proc interface 'hugetlb_shm_group' is introduced to avoid these
difficulties.
Please correct me, if I am wrong.

Regarding the problem with the 'if' condition, I feel that even in the
case of
user's lock_limit is set to unlimited, he could use unlimited hugepages and
normal page shm segments. So what is the advantage in this scenario.

I tried to avoid the #ifdef statements. But the variable
sysctl_hugetlb_shm_group is defined
in fs/hugetlbfs/inode.c, this segment is enabled only when the config
parameter
CONFIG_HUGETLBFS is set to yes. If the hugetlbfs is not selected while
configuring,
there would be a compilation error.

Is there any better way so that the root user can configure the gid in
'hugetlb_shm_group'
and the user is able to access the huge pages using shmget().

Thanks
Ciju

aglitke wrote:
> Hi Ciju:
>
> I am still not exactly sure why this patch is needed. As I read
> user_shm_lock():
>
>
>> lock_limit = current->signal->rlim[RLIMIT_MEMLOCK].rlim_cur;
>> if (lock_limit == RLIM_INFINITY)
>> allowed = 1;
>> lock_limit >>= PAGE_SHIFT;
>> spin_lock(&shmlock_user_lock);
>> if (!allowed &&
>> locked + user->locked_shm > lock_limit && !capable(CAP_IPC_LOCK))
>> goto out;
>>
>
> ... if the user's locked limit (ulimit -l) is set to unlimited, allowed
> (above) is set to 1. In that case, the second part of that if() is
> bypassed, and the function grants permission. Therefore, the easy
> solution is to make sure your user's lock_limit is RLIM_INFINITY.
>
> On Wed, 2007-11-14 at 19:45 +0530, Ciju Rajan K wrote:
> <snip>
>
>> @@ -248,8 +249,14 @@ int user_shm_lock(size_t size, struct us
>> allowed = 1;
>> lock_limit >>= PAGE_SHIFT;
>> spin_lock(&shmlock_user_lock);
>> +#ifdef CONFIG_HUGETLB_PAGE
>> + if (!allowed &&
>> + locked + user->locked_shm > lock_limit &&
>> + (!(capable(CAP_IPC_LOCK) || in_group_p(sysctl_hugetlb_shm_group))))
>>
>
> This will allow any user in hugetlb_shm_group to make unlimited use of
> huge page shm segments _and_ normal page shm segments. Definitely not
> what you want.
>
>
>> +#else
>> if (!allowed &&
>> locked + user->locked_shm > lock_limit && !capable(CAP_IPC_LOCK))
>> +#endif
>> goto out;
>> get_uid(user);
>> user->locked_shm += locked;
>>
>>
>
> Please don't add new #ifdefs into .c files, headers only.
>
>

-
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/

\
 
 \ /
  Last update: 2007-11-16 15:33    [W:0.072 / U:0.116 seconds]
©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site