Use setrlimit64(), if available, instead of setrlimit() when setting
authorTodd C. Miller <Todd.Miller@courtesan.com>
Sat, 6 Feb 2010 20:16:04 +0000 (15:16 -0500)
committerTodd C. Miller <Todd.Miller@courtesan.com>
Sat, 6 Feb 2010 20:16:04 +0000 (15:16 -0500)
AIX resource limits since rlim_t is 32bits.

--HG--
branch : 1.7

aix.c
config.h.in
configure
configure.in

diff --git a/aix.c b/aix.c
index f2d9d9c3255564fcd9d14a151ec2899841a6339b..aa615681937b2e89d88bfc455ca39321724cce2f 100644 (file)
--- a/aix.c
+++ b/aix.c
 
 #ifdef HAVE_GETUSERATTR
 
+#ifndef HAVE_SETRLIMIT64
+# define setrlimit64(a, b) setrlimit(a, b)
+# define rlimit64 rlimit
+# define rlim64_t rlim_t
+# define RLIM64_INFINITY RLIM_INFINITY
+#endif /* HAVE_SETRLIMIT64 */
+
 #ifndef RLIM_SAVED_MAX
-# define RLIM_SAVED_MAX        RLIM_INFINITY
+# define RLIM_SAVED_MAX        RLIM64_INFINITY
 #endif
 
 struct aix_limit {
@@ -59,10 +66,15 @@ static int
 aix_getlimit(user, lim, valp)
     char *user;
     char *lim;
-    int *valp;
+    rlim64_t *valp;
 {
-    if (getuserattr(user, lim, valp, SEC_INT) != 0)
-       return getuserattr("default", lim, valp, SEC_INT);
+    int val;
+
+    if (getuserattr(user, lim, &val, SEC_INT) != 0 &&
+       getuserattr("default", lim, &val, SEC_INT) != 0) {
+       return(-1);
+    }
+    *valp = val;
     return(0);
 }
 
@@ -70,28 +82,29 @@ void
 aix_setlimits(user)
     char *user;
 {
-    struct rlimit rlim;
-    int i, n;
+    struct rlimit64 rlim;
+    rlim64_t val;
+    int n;
 
     /*
      * For each resource limit, get the soft/hard values for the user
-     * and set those values via setrlimit().  Must be run as euid 0.
+     * and set those values via setrlimit64().  Must be run as euid 0.
      */
     for (n = 0; n < sizeof(aix_limits) / sizeof(aix_limits[0]); n++) {
        /*
         * We have two strategies, depending on whether or not the
         * hard limit has been defined.
         */
-       if (aix_getlimit(user, aix_limits[n].hard, &i) == 0) {
-           rlim.rlim_max = i == -1 ? RLIM_INFINITY : i * aix_limits[n].factor;
-           if (aix_getlimit(user, aix_limits[n].soft, &i) == 0)
-               rlim.rlim_cur = i == -1 ? RLIM_INFINITY : i * aix_limits[n].factor;
+       if (aix_getlimit(user, aix_limits[n].hard, &val) == 0) {
+           rlim.rlim_max = val == -1 ? RLIM64_INFINITY : val * aix_limits[n].factor;
+           if (aix_getlimit(user, aix_limits[n].soft, &val) == 0)
+               rlim.rlim_cur = val == -1 ? RLIM64_INFINITY : val * aix_limits[n].factor;
            else
                rlim.rlim_cur = rlim.rlim_max;  /* soft not specd, use hard */
        } else {
            /* No hard limit set, try soft limit. */
-           if (aix_getlimit(user, aix_limits[n].soft, &i) == 0)
-               rlim.rlim_cur = i == -1 ? RLIM_INFINITY : i * aix_limits[n].factor;
+           if (aix_getlimit(user, aix_limits[n].soft, &val) == 0)
+               rlim.rlim_cur = val == -1 ? RLIM64_INFINITY : val * aix_limits[n].factor;
 
            /* Set hard limit per AIX /etc/security/limits documentation. */
            switch (aix_limits[n].resource) {
@@ -103,11 +116,11 @@ aix_setlimits(user)
                    rlim.rlim_max = RLIM_SAVED_MAX;
                    break;
                default:
-                   rlim.rlim_max = RLIM_INFINITY;
+                   rlim.rlim_max = RLIM64_INFINITY;
                    break;
            }
        }
-       (void)setrlimit(aix_limits[n].resource, &rlim);
+       (void)setrlimit64(aix_limits[n].resource, &rlim);
     }
 }
 
index f3935410de40a6a7663d49fe3e124e4ca6900db6..a00b62371e3e57e0f5b698ef7b00c1b6628a5d91 100644 (file)
 /* Define to 1 if you have the `setrlimit' function. */
 #undef HAVE_SETRLIMIT
 
+/* Define to 1 if you have the `setrlimit64' function. */
+#undef HAVE_SETRLIMIT64
+
 /* Define to 1 if you have the `setsid' function. */
 #undef HAVE_SETSID
 
index 63b55d35d9f5057a9473ab81a8247c88691ec7db..2077d3682b46ed9af9d8055c6e537de3bbb521be 100755 (executable)
--- a/configure
+++ b/configure
@@ -16037,12 +16037,13 @@ LIBS=$ac_save_LIBS
 
 
 
+
 
 
 for ac_func in dup2 strchr strrchr memchr memcpy memset sysconf tzset \
               strftime setrlimit initgroups getgroups fstat gettimeofday \
               regcomp setlocale getaddrinfo setsid setenv vhangup \
-              mbr_check_membership
+              mbr_check_membership setrlimit64
 do
 as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh`
 { echo "$as_me:$LINENO: checking for $ac_func" >&5
index dcffbdd1ad7a45d0df5f2752f2ae7495964948fa..765240ab45a9f3132693331318e6d2848760e52f 100644 (file)
@@ -1848,7 +1848,7 @@ AC_FUNC_GETGROUPS
 AC_CHECK_FUNCS(dup2 strchr strrchr memchr memcpy memset sysconf tzset \
               strftime setrlimit initgroups getgroups fstat gettimeofday \
               regcomp setlocale getaddrinfo setsid setenv vhangup \
-              mbr_check_membership)
+              mbr_check_membership setrlimit64)
 AC_CHECK_FUNCS(getline, [], [
     AC_LIBOBJ(getline)
     AC_CHECK_FUNCS(fgetln)