new template
[unix-history] / usr / src / sbin / fsck / pass1.c
index c7ef655..3ecc82a 100644 (file)
@@ -5,7 +5,7 @@
  */
 
 #ifndef lint
  */
 
 #ifndef lint
-static char sccsid[] = "@(#)pass1.c    5.1 (Berkeley) %G%";
+static char sccsid[] = "@(#)pass1.c    5.4 (Berkeley) %G%";
 #endif not lint
 
 #include <sys/param.h>
 #endif not lint
 
 #include <sys/param.h>
@@ -69,11 +69,18 @@ pass1()
                                continue;
                        }
                        lastino = inumber;
                                continue;
                        }
                        lastino = inumber;
-                       if (dp->di_size < 0) {
+                       if (dp->di_size < 0 ||
+                           dp->di_size + sblock.fs_bsize - 1 < 0) {
                                if (debug)
                                        printf("bad size %d:", dp->di_size);
                                goto unknown;
                        }
                                if (debug)
                                        printf("bad size %d:", dp->di_size);
                                goto unknown;
                        }
+                       if (!preen && (dp->di_mode & IFMT) == IFMT &&
+                           reply("HOLD BAD BLOCK") == 1) {
+                               dp->di_size = sblock.fs_fsize;
+                               dp->di_mode = IFREG|0600;
+                               inodirty();
+                       }
                        ndb = howmany(dp->di_size, sblock.fs_bsize);
                        if (SPECIAL(dp))
                                ndb++;
                        ndb = howmany(dp->di_size, sblock.fs_bsize);
                        if (SPECIAL(dp))
                                ndb++;
@@ -93,12 +100,7 @@ pass1()
                                                        dp->di_ib[j]);
                                        goto unknown;
                                }
                                                        dp->di_ib[j]);
                                        goto unknown;
                                }
-                       if (!preen && (dp->di_mode & IFMT) == IFMT &&
-                           reply("HOLD BAD BLOCK") == 1) {
-                               dp->di_size = sblock.fs_fsize;
-                               dp->di_mode = IFREG|0600;
-                               inodirty();
-                       } else if (ftypeok(dp) == 0)
+                       if (ftypeok(dp) == 0)
                                goto unknown;
                        n_files++;
                        lncntp[inumber] = dp->di_nlink;
                                goto unknown;
                        n_files++;
                        lncntp[inumber] = dp->di_nlink;
@@ -132,7 +134,9 @@ pass1()
                        continue;
        unknown:
                        pfatal("UNKNOWN FILE TYPE I=%u", inumber);
                        continue;
        unknown:
                        pfatal("UNKNOWN FILE TYPE I=%u", inumber);
+                       statemap[inumber] = FCLEAR;
                        if (reply("CLEAR") == 1) {
                        if (reply("CLEAR") == 1) {
+                               statemap[inumber] = USTATE;
                                zapino(dp);
                                inodirty();
                        }
                                zapino(dp);
                                inodirty();
                        }