]> git.decadent.org.uk Git - nfs-utils.git/blobdiff - support/nfs/cacheio.c
Fix bug [ 1157791 ] Segfault in mountd.
[nfs-utils.git] / support / nfs / cacheio.c
index ff5b02813e256c12b017da5356d80ecb17b9c43c..d7ad4293762f4b6dd583fec668cb0ea9df47b733 100644 (file)
@@ -205,16 +205,17 @@ int readline(int fd, char **buf, int *lenp)
         */
                char *new;
                int nl;
         */
                char *new;
                int nl;
-               *lenp += 128;
+               *lenp *= 2;
                new = realloc(*buf, *lenp);
                if (new == NULL)
                        return 0;
                new = realloc(*buf, *lenp);
                if (new == NULL)
                        return 0;
-               nl = read(fd, *buf +len, *lenp - len);
-               if (nl <= 0 )
+               *buf = new;
+               nl = read(fd, *buf + len, *lenp - len);
+               if (nl <= 0)
                        return 0;
                        return 0;
-               new += nl;
+               len += nl;
        }
        }
-       (*buf)[len-1] = 0;
+       (*buf)[len-1] = '\0';
        return 1;
 }
 
        return 1;
 }
 
@@ -227,7 +228,8 @@ int
 check_new_cache(void)
 {
        struct stat stb;
 check_new_cache(void)
 {
        struct stat stb;
-       return (stat("/proc/fs/nfs/filehandle", &stb) == 0);
+       return  (stat("/proc/fs/nfs/filehandle", &stb) == 0) ||
+               (stat("/proc/fs/nfsd/filehandle", &stb) == 0);
 }      
 
 
 }      
 
 
@@ -245,10 +247,16 @@ cache_flush(int force)
        int c;
        char stime[20];
        char path[200];
        int c;
        char stime[20];
        char path[200];
+       /* Note: the order of these caches is important.
+        * The need to be flushed in dependancy order. So
+        * a cache that references items in another cache,
+        * as nfsd.fh entries reference items in nfsd.export,
+        * must be flushed before the cache that it references.
+        */
        static char *cachelist[] = {
                "auth.unix.ip",
        static char *cachelist[] = {
                "auth.unix.ip",
-               "nfsd.export",
                "nfsd.fh",
                "nfsd.fh",
+               "nfsd.export",
                NULL
        };
        stb.st_mtime = time(0);
                NULL
        };
        stb.st_mtime = time(0);