fix bug that caused du to core dump while working on execute only directories
authorKirk McKusick <mckusick@ucbvax.Berkeley.EDU>
Fri, 12 Nov 1982 11:23:07 +0000 (03:23 -0800)
committerKirk McKusick <mckusick@ucbvax.Berkeley.EDU>
Fri, 12 Nov 1982 11:23:07 +0000 (03:23 -0800)
SCCS-vsn: usr.bin/du/du.c 4.7

usr/src/usr.bin/du/du.c

index cedc186..df6cbbb 100644 (file)
@@ -1,5 +1,5 @@
 #ifndef lint
 #ifndef lint
-static char *sccsid = "@(#)du.c        4.6 (Berkeley) %G%";
+static char *sccsid = "@(#)du.c        4.7 (Berkeley) %G%";
 #endif
 
 #include <stdio.h>
 #endif
 
 #include <stdio.h>
@@ -115,16 +115,19 @@ descend(base, name)
                        printf("%ld\t%s\n", kbytes, base);
                return (kbytes);
        }
                        printf("%ld\t%s\n", kbytes, base);
                return (kbytes);
        }
-       if (chdir(name) < 0)
-               return (0);
        if (dirp != NULL)
                closedir(dirp);
        if (dirp != NULL)
                closedir(dirp);
-       dirp = opendir(".");
+       dirp = opendir(name);
        if (dirp == NULL) {
                perror(base);
                *ebase0 = 0;
                return (0);
        }
        if (dirp == NULL) {
                perror(base);
                *ebase0 = 0;
                return (0);
        }
+       if (chdir(name) < 0) {
+               perror(base);
+               *ebase0 = 0;
+               return (0);
+       }
        while (dp = readdir(dirp)) {
                if (!strcmp(dp->d_name, ".") || !strcmp(dp->d_name, ".."))
                        continue;
        while (dp = readdir(dirp)) {
                if (!strcmp(dp->d_name, ".") || !strcmp(dp->d_name, ".."))
                        continue;
@@ -134,6 +137,10 @@ descend(base, name)
                *ebase = 0;
                if (dirp == NULL) {
                        dirp = opendir(".");
                *ebase = 0;
                if (dirp == NULL) {
                        dirp = opendir(".");
+                       if (dirp == NULL) {
+                               perror(".");
+                               return (0);
+                       }
                        seekdir(dirp, curoff);
                }
        }
                        seekdir(dirp, curoff);
                }
        }