fix "bread 0" panic: must check for cache ptr past end of directory after ICHG
authorKirk McKusick <mckusick@ucbvax.Berkeley.EDU>
Fri, 11 Jan 1985 11:33:50 +0000 (03:33 -0800)
committerKirk McKusick <mckusick@ucbvax.Berkeley.EDU>
Fri, 11 Jan 1985 11:33:50 +0000 (03:33 -0800)
SCCS-vsn: sys/kern/vfs_lookup.c 6.16
SCCS-vsn: sys/ufs/ffs/ufs_lookup.c 6.16
SCCS-vsn: sys/ufs/ufs/ufs_lookup.c 6.16

usr/src/sys/kern/vfs_lookup.c
usr/src/sys/ufs/ffs/ufs_lookup.c
usr/src/sys/ufs/ufs/ufs_lookup.c

index 07cf2bd..a3504b3 100644 (file)
@@ -1,4 +1,4 @@
-/*     vfs_lookup.c    6.15    84/08/29        */
+/*     vfs_lookup.c    6.16    85/01/10        */
 
 #include "param.h"
 #include "systm.h"
 
 #include "param.h"
 #include "systm.h"
@@ -384,7 +384,10 @@ dirloop2:
                numdirpasses = 1;
        } else {
                if ((dp->i_flag & ICHG) || dp->i_ctime >= u.u_ncache.nc_time) {
                numdirpasses = 1;
        } else {
                if ((dp->i_flag & ICHG) || dp->i_ctime >= u.u_ncache.nc_time) {
-                       u.u_ncache.nc_prevoffset &= ~(DIRBLKSIZ - 1);
+                       if (u.u_ncache.nc_prevoffset > dp->i_size)
+                               u.u_ncache.nc_prevoffset = 0;
+                       else
+                               u.u_ncache.nc_prevoffset &= ~(DIRBLKSIZ - 1);
                        u.u_ncache.nc_time = time.tv_sec;
                }
                ndp->ni_offset = u.u_ncache.nc_prevoffset;
                        u.u_ncache.nc_time = time.tv_sec;
                }
                ndp->ni_offset = u.u_ncache.nc_prevoffset;
index c3f06b9..fd1bd57 100644 (file)
@@ -1,4 +1,4 @@
-/*     ufs_lookup.c    6.15    84/08/29        */
+/*     ufs_lookup.c    6.16    85/01/10        */
 
 #include "param.h"
 #include "systm.h"
 
 #include "param.h"
 #include "systm.h"
@@ -384,7 +384,10 @@ dirloop2:
                numdirpasses = 1;
        } else {
                if ((dp->i_flag & ICHG) || dp->i_ctime >= u.u_ncache.nc_time) {
                numdirpasses = 1;
        } else {
                if ((dp->i_flag & ICHG) || dp->i_ctime >= u.u_ncache.nc_time) {
-                       u.u_ncache.nc_prevoffset &= ~(DIRBLKSIZ - 1);
+                       if (u.u_ncache.nc_prevoffset > dp->i_size)
+                               u.u_ncache.nc_prevoffset = 0;
+                       else
+                               u.u_ncache.nc_prevoffset &= ~(DIRBLKSIZ - 1);
                        u.u_ncache.nc_time = time.tv_sec;
                }
                ndp->ni_offset = u.u_ncache.nc_prevoffset;
                        u.u_ncache.nc_time = time.tv_sec;
                }
                ndp->ni_offset = u.u_ncache.nc_prevoffset;
index c3f06b9..fd1bd57 100644 (file)
@@ -1,4 +1,4 @@
-/*     ufs_lookup.c    6.15    84/08/29        */
+/*     ufs_lookup.c    6.16    85/01/10        */
 
 #include "param.h"
 #include "systm.h"
 
 #include "param.h"
 #include "systm.h"
@@ -384,7 +384,10 @@ dirloop2:
                numdirpasses = 1;
        } else {
                if ((dp->i_flag & ICHG) || dp->i_ctime >= u.u_ncache.nc_time) {
                numdirpasses = 1;
        } else {
                if ((dp->i_flag & ICHG) || dp->i_ctime >= u.u_ncache.nc_time) {
-                       u.u_ncache.nc_prevoffset &= ~(DIRBLKSIZ - 1);
+                       if (u.u_ncache.nc_prevoffset > dp->i_size)
+                               u.u_ncache.nc_prevoffset = 0;
+                       else
+                               u.u_ncache.nc_prevoffset &= ~(DIRBLKSIZ - 1);
                        u.u_ncache.nc_time = time.tv_sec;
                }
                ndp->ni_offset = u.u_ncache.nc_prevoffset;
                        u.u_ncache.nc_time = time.tv_sec;
                }
                ndp->ni_offset = u.u_ncache.nc_prevoffset;