Author: dgilmore
Date: 2010-10-12 19:07:00 -0400 (Tue, 12 Oct 2010)
New Revision: 3372

Modified:
   trunk/osprey/libhugetlbfs/hugeutils.c
Log:
Fix libhugetlbfs problem -- bug 667.

Approved by Sun.


Modified: trunk/osprey/libhugetlbfs/hugeutils.c
===================================================================
--- trunk/osprey/libhugetlbfs/hugeutils.c       2010-10-12 17:14:29 UTC (rev 
3371)
+++ trunk/osprey/libhugetlbfs/hugeutils.c       2010-10-12 23:07:00 UTC (rev 
3372)
@@ -218,76 +218,56 @@
 #endif
 }
 
-#define MOUNTS_SZ      4096
+#define LINE_MAXLEN    2048
 
 const char *hugetlbfs_find_path(void)
 {
-       int err, readerr;
-       char *tmp;
-       int fd, len;
-       char buf[MOUNTS_SZ];
-       char mytag[12]; /* to check if the tag is hugetlbfs, so 10 bytes are 
enough */
-       const char hugetlbtag[]="hugetlbfs";
+       int fd;
+       char line[LINE_MAXLEN + 1];
+       char *eol;
+       int bytes, err;
+       off_t offset;
+
        /* Have we already located a mount? */
        if (*htlb_mount)
                return htlb_mount;
 
-       /* No?  Let's see if we've been told where to look */
-       tmp = getenv("HUGETLB_PATH");
-       if (tmp) {
-               err = hugetlbfs_test_path(tmp);
-               if (err < 0) {
-                       ERROR("Can't statfs() \"%s\" (%s)\n",
-                             tmp, strerror(errno));
-                       return NULL;
-               } else if (err == 0) {
-                       ERROR("\"%s\" is not a hugetlbfs mount\n", tmp);
-                       return NULL;
-               }
-               strncpy(htlb_mount, tmp, sizeof(htlb_mount)-1);
-               return htlb_mount;
-       }
-
-       /* Oh well, let's go searching for a mountpoint */
        fd = open("/proc/mounts", O_RDONLY);
        if (fd < 0) {
                fd = open("/etc/mtab", O_RDONLY);
                if (fd < 0) {
                        ERROR("Couldn't open /proc/mounts or /etc/mtab (%s)\n",
-                             strerror(errno));
+                               strerror(errno));
                        return NULL;
                }
        }
 
-       len = read(fd, buf, sizeof(buf));
-       readerr = errno;
-       close(fd);
-       if (len < 0) {
-               ERROR("Error reading mounts (%s)\n", strerror(errno));
-               return NULL;
-       }
-       if (len >= sizeof(buf)) {
-               ERROR("/proc/mounts is too long\n");
-               return NULL;
-       }
-       buf[sizeof(buf)-1] = '\0';
+       while ((bytes = read(fd, line, LINE_MAXLEN)) > 0) {
+               line[LINE_MAXLEN] = '\0';
+               eol = strchr(line, '\n');
+               if (!eol) {
+                       ERROR("Line too long when parsing mounts\n");
+                       break;
+               }
 
-       tmp = buf;
-       while (tmp) {
-               err = sscanf(tmp,
-                            "%*s %" stringify(PATH_MAX)
-                            "s %12s ",
-                            htlb_mount, mytag);
+               /*
+                * Truncate the string to just one line and reset the file
+                * to begin reading at the start of the next line.
+                */
+               *eol = '\0';
+               offset = bytes - (eol + 1 - line);
+               lseek(fd, -offset, SEEK_CUR);
 
-               if ((err == 2) && (strcmp(mytag, hugetlbtag) == 0) 
&&(hugetlbfs_test_path(htlb_mount) == 1)) 
+               err = sscanf(line, "%*s %" stringify(PATH_MAX) "s hugetlbfs ",
+                       htlb_mount);
+               if ((err == 1) && (hugetlbfs_test_path(htlb_mount) == 1)) {
+                       close(fd);
                        return htlb_mount;
+               }
 
                memset(htlb_mount, 0, sizeof(htlb_mount));
-                
-               tmp = strchr(tmp, '\n');
-               if (tmp)
-                       tmp++;
        }
+       close(fd);
 
 #if defined(OPEN64_MOD) && defined(M_PAGE)
         if (hugepage_m_stype != SIZE_1G)


------------------------------------------------------------------------------
Beautiful is writing same markup. Internet Explorer 9 supports
standards for HTML5, CSS3, SVG 1.1,  ECMAScript5, and DOM L2 & L3.
Spend less time writing and  rewriting code and more time creating great
experiences on the web. Be a part of the beta today.
http://p.sf.net/sfu/beautyoftheweb
_______________________________________________
Open64-devel mailing list
Open64-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/open64-devel

Reply via email to