Fix AIX limit setting. getuserattr() returns values in disk blocks rather

than bytes.  The default hard stack size in newer AIX is RLIM_SAVED_MAX.
From Dale King.
This commit is contained in:
Todd C. Miller
2008-10-03 13:19:31 +00:00
parent 0372d7dc2b
commit ad4dd3b223

27
aix.c
View File

@@ -38,20 +38,25 @@ __unused static const char rcsid[] = "$Sudo$";
#ifdef HAVE_GETUSERATTR #ifdef HAVE_GETUSERATTR
#ifndef RLIM_SAVED_MAX
# define RLIM_SAVED_MAX 0x400000
#endif
struct aix_limit { struct aix_limit {
int resource; int resource;
char *soft; char *soft;
char *hard; char *hard;
int factor;
}; };
static struct aix_limit aix_limits[] = { static struct aix_limit aix_limits[] = {
{ RLIMIT_FSIZE, S_UFSIZE, S_UFSIZE_HARD }, { RLIMIT_FSIZE, S_UFSIZE, S_UFSIZE_HARD, 512 },
{ RLIMIT_CPU, S_UCPU, S_UCPU_HARD }, { RLIMIT_CPU, S_UCPU, S_UCPU_HARD, 1 },
{ RLIMIT_DATA, S_UDATA, S_UDATA_HARD }, { RLIMIT_DATA, S_UDATA, S_UDATA_HARD, 512 },
{ RLIMIT_STACK, S_USTACK, S_USTACK_HARD }, { RLIMIT_STACK, S_USTACK, S_USTACK_HARD, 512 },
{ RLIMIT_RSS, S_URSS, S_URSS_HARD }, { RLIMIT_RSS, S_URSS, S_URSS_HARD, 512 },
{ RLIMIT_CORE, S_UCORE, S_UCORE_HARD }, { RLIMIT_CORE, S_UCORE, S_UCORE_HARD, 512 },
{ RLIMIT_NOFILE, S_UNOFILE, S_UNOFILE_HARD } { RLIMIT_NOFILE, S_UNOFILE, S_UNOFILE_HARD, 1 }
}; };
static int static int
@@ -82,15 +87,15 @@ aix_setlimits(user)
* hard limit has been defined. * hard limit has been defined.
*/ */
if (aix_getlimit(user, aix_limits[n].hard, &i) == 0) { if (aix_getlimit(user, aix_limits[n].hard, &i) == 0) {
rlim.rlim_max = i == -1 ? RLIM_INFINITY : i; rlim.rlim_max = i == -1 ? RLIM_INFINITY : i * aix_limits[n].factor;
if (aix_getlimit(user, aix_limits[n].soft, &i) == 0) if (aix_getlimit(user, aix_limits[n].soft, &i) == 0)
rlim.rlim_cur = i == -1 ? RLIM_INFINITY : i; rlim.rlim_cur = i == -1 ? RLIM_INFINITY : i * aix_limits[n].factor;
else else
rlim.rlim_cur = rlim.rlim_max; /* soft not specd, use hard */ rlim.rlim_cur = rlim.rlim_max; /* soft not specd, use hard */
} else { } else {
/* No hard limit set, try soft limit. */ /* No hard limit set, try soft limit. */
if (aix_getlimit(user, aix_limits[n].soft, &i) == 0) if (aix_getlimit(user, aix_limits[n].soft, &i) == 0)
rlim.rlim_cur = i == -1 ? RLIM_INFINITY : i; rlim.rlim_cur = i == -1 ? RLIM_INFINITY : i * aix_limits[n].factor;
/* Set hard limit per AIX /etc/security/limits documentation. */ /* Set hard limit per AIX /etc/security/limits documentation. */
switch (aix_limits[n].resource) { switch (aix_limits[n].resource) {
@@ -99,7 +104,7 @@ aix_setlimits(user)
rlim.rlim_max = rlim.rlim_cur; rlim.rlim_max = rlim.rlim_cur;
break; break;
case RLIMIT_STACK: case RLIMIT_STACK:
rlim.rlim_max = 0x400000; rlim.rlim_max = RLIM_SAVED_MAX;
break; break;
default: default:
rlim.rlim_max = RLIM_INFINITY; rlim.rlim_max = RLIM_INFINITY;