Ver Fonte

Ticket 48846 - Rlimit checks should detect RLIM_INFINITY

Bug Description:  On certain platforms (32 bit) it was possible for dsktune and
other checks to fail as rlim.cur and rlim.max was -1. This would result in a
pattern of rlim.cur < some base limit, failing, even though rlimit implied
infinite. This did not affect 64bit platforms as rlim_infinity for them is
uint64 max.

Fix Description:  Fix our various checks to look for and detect RLIM_INFINITY
when set correctly.

https://fedorahosted.org/389/ticket/48846

Author: wibrown

Review by: nhosoi (Thanks!)
William Brown há 9 anos atrás
pai
commit
17a56dbb67
2 ficheiros alterados com 44 adições e 12 exclusões
  1. 22 9
      ldap/servers/slapd/util.c
  2. 22 3
      ldap/systools/idsktune.c

+ 22 - 9
ldap/servers/slapd/util.c

@@ -1571,6 +1571,7 @@ int util_info_sys_pages(size_t *pagesize, size_t *pages, size_t *procpages, size
 
         size_t vmsize = 0;
         size_t freesize = 0;
+        size_t rlimsize = 0;
 
         *pagesize = getpagesize();
 
@@ -1632,8 +1633,14 @@ int util_info_sys_pages(size_t *pagesize, size_t *pages, size_t *procpages, size
         freesize /= (*pagesize / 1024);
         /* procpages is now in kb not pages... */
         *procpages /= (*pagesize / 1024);
-        /* This is in bytes, make it pages  */
-        *availpages = util_getvirtualmemsize() / *pagesize;
+
+        rlimsize = util_getvirtualmemsize();
+        /* On a 64 bit system, this is uint64 max, but on 32 it's -1 */
+        /* Either way, we should be ignoring it at this point if it's infinite */
+        if (rlimsize != RLIM_INFINITY) {
+            /* This is in bytes, make it pages  */
+            rlimsize = rlimsize / *pagesize;
+        }
         /* Now we have vmsize, the availpages from getrlimit, our freesize */
         vmsize /= (*pagesize / 1024);
 
@@ -1655,19 +1662,25 @@ int util_info_sys_pages(size_t *pagesize, size_t *pages, size_t *procpages, size
          * - getrlimit (availpages)
          * - freesize
          */
-        LDAPDebug(LDAP_DEBUG_TRACE,"util_info_sys_pages pages=%lu, getrlim=%lu, freesize=%lu\n",
-            (unsigned long)*pages, (unsigned long)*availpages, (unsigned long)freesize);
-        if (*pages < *availpages && *pages < freesize) {
+        if (rlimsize == RLIM_INFINITY) {
+            LDAPDebug(LDAP_DEBUG_TRACE,"util_info_sys_pages pages=%lu, getrlim=RLIM_INFINITY, freesize=%lu\n",
+                (unsigned long)*pages, (unsigned long)freesize, 0);
+        } else {
+            LDAPDebug(LDAP_DEBUG_TRACE,"util_info_sys_pages pages=%lu, getrlim=%lu, freesize=%lu\n",
+                (unsigned long)*pages, (unsigned long)*availpages, (unsigned long)freesize);
+        }
+
+        if (rlimsize != RLIM_INFINITY && rlimsize < freesize && rlimsize < *pages) {
+            LDAPDebug(LDAP_DEBUG_TRACE,"util_info_sys_pages using getrlim for availpages \n",0,0,0);
+            *availpages = rlimsize;
+        } else if (*pages < freesize) {
             LDAPDebug(LDAP_DEBUG_TRACE,"util_info_sys_pages using pages for availpages \n",0,0,0);
             *availpages = *pages;
-        } else if ( freesize < *pages && freesize < *availpages ) {
+        } else {
             LDAPDebug(LDAP_DEBUG_TRACE,"util_info_sys_pages using freesize for availpages \n",0,0,0);
             *availpages = freesize;
-        } else {
-            LDAPDebug(LDAP_DEBUG_TRACE,"util_info_sys_pages using getrlim for availpages \n",0,0,0);
         }
 
-
     }
 #endif /* linux */
 

+ 22 - 3
ldap/systools/idsktune.c

@@ -2380,7 +2380,12 @@ static void disk_tests(void)
     if (flag_debug) {
         printf("DEBUG  : RLIMIT_CORE is %ld, %ld\n", r.rlim_cur, r.rlim_max);
     }
-    if (r.rlim_cur == (unsigned long)-1 || r.rlim_cur >= 2147483647) {
+
+#if defined(RLIM_INFINITY)
+    if (r.rlim_cur == RLIM_INFINITY || r.rlim_cur >= 2147483647) {
+#else
+    if (r.rlim_cur >= 2147483647) {
+#endif
         if (swap_mb <2048) {
             max_core = swap_mb;
         } else {
@@ -2482,7 +2487,7 @@ static void check_mem_size(int ro,char *rn)
     rprev = r.rlim_cur;
     r.rlim_cur = r.rlim_max;
     setrlimit(ro,&r);
-    getrlimit(ro,&r);  
+    getrlimit(ro,&r);
 
     if (flag_debug) printf("DEBUG  : %s (%d) max %d prev %d.\n", rn, ro, (int)r.rlim_cur, rprev);
 
@@ -2490,11 +2495,17 @@ static void check_mem_size(int ro,char *rn)
     if (r.rlim_cur <= 0L) {
         return;
     }
-#endif  
+#endif
     if (r.rlim_cur <= 0) {
         return;
     }
 
+#if defined(RLIM_INFINITY)
+    if (r.rlim_cur == RLIM_INFINITY) {
+        return;
+    }
+#endif
+
     m_mb = r.rlim_cur / 1048576;
 
     if (m_mb < mem_min) {   /* 64 MB */
@@ -2522,7 +2533,11 @@ static void limits_tests(void)
 #if defined(RLIMIT_NOFILE)  
     getrlimit(RLIMIT_NOFILE,&r);
 
+#if defined(RLIM_INFINITY)
+    if (r.rlim_max <= 1024 && r.rlim_max != RLIM_INFINITY) {
+#else
     if (r.rlim_max <= 1024) {
+#endif
         if (flag_html) printf("<P>\n");
 
         if (flag_carrier) {
@@ -2568,7 +2583,11 @@ static void limits_tests(void)
         }
     }
 
+#if defined(RLIM_INFINITY)
+    if (r.rlim_cur <= 1024 && r.rlim_max != RLIM_INFINITY) {
+#else
     if (r.rlim_cur <= 1024) {
+#endif
         if (flag_html) {
             printf("<P>\n");
         }