dircheck() shouldn't be looking at d_type or d_namlen in blank entries
authorKirk McKusick <mckusick@ucbvax.Berkeley.EDU>
Fri, 9 Dec 1994 14:30:40 +0000 (06:30 -0800)
committerKirk McKusick <mckusick@ucbvax.Berkeley.EDU>
Fri, 9 Dec 1994 14:30:40 +0000 (06:30 -0800)
(from mycroft)

SCCS-vsn: sbin/fsck/dir.c 8.5

usr/src/sbin/fsck/dir.c

index bded430..7104739 100644 (file)
@@ -6,7 +6,7 @@
  */
 
 #ifndef lint
  */
 
 #ifndef lint
-static char sccsid[] = "@(#)dir.c      8.4 (Berkeley) %G%";
+static char sccsid[] = "@(#)dir.c      8.5 (Berkeley) %G%";
 #endif /* not lint */
 
 #include <sys/param.h>
 #endif /* not lint */
 
 #include <sys/param.h>
@@ -193,8 +193,15 @@ dircheck(idesc, dp)
        u_char namlen, type;
        int spaceleft;
 
        u_char namlen, type;
        int spaceleft;
 
-       size = DIRSIZ(!newinofmt, dp);
        spaceleft = DIRBLKSIZ - (idesc->id_loc % DIRBLKSIZ);
        spaceleft = DIRBLKSIZ - (idesc->id_loc % DIRBLKSIZ);
+       if (dp->d_ino >= maxino ||
+           dp->d_reclen == 0 ||
+           dp->d_reclen > spaceleft ||
+           (dp->d_reclen & 0x3) != 0)
+               return (0);
+       if (dp->d_ino == 0)
+               return (1);
+       size = DIRSIZ(!newinofmt, dp);
 #      if (BYTE_ORDER == LITTLE_ENDIAN)
                if (!newinofmt) {
                        type = dp->d_namlen;
 #      if (BYTE_ORDER == LITTLE_ENDIAN)
                if (!newinofmt) {
                        type = dp->d_namlen;
@@ -207,23 +214,17 @@ dircheck(idesc, dp)
                namlen = dp->d_namlen;
                type = dp->d_type;
 #      endif
                namlen = dp->d_namlen;
                type = dp->d_type;
 #      endif
-       if (dp->d_ino < maxino &&
-           dp->d_reclen != 0 &&
-           dp->d_reclen <= spaceleft &&
-           (dp->d_reclen & 0x3) == 0 &&
-           dp->d_reclen >= size &&
-           idesc->id_filesize >= size &&
-           namlen <= MAXNAMLEN &&
-           type <= 15) {
-               if (dp->d_ino == 0)
-                       return (1);
-               for (cp = dp->d_name, size = 0; size < namlen; size++)
-                       if (*cp == 0 || (*cp++ == '/'))
-                               return (0);
-               if (*cp == 0)
-                       return (1);
-       }
-       return (0);
+       if (dp->d_reclen < size ||
+           idesc->id_filesize < size ||
+           namlen > MAXNAMLEN ||
+           type > 15)
+               return (0);
+       for (cp = dp->d_name, size = 0; size < namlen; size++)
+               if (*cp == '\0' || (*cp++ == '/'))
+                       return (0);
+       if (*cp != '\0')
+               return (0);
+       return (1);
 }
 
 direrror(ino, errmesg)
 }
 
 direrror(ino, errmesg)