Fix fsck_ufs segfaults with gjournal (SU+J)

The segfault was being hit in ckfini() (sbin/fsck_ffs/fsutil.c)
while attempting to traverse the buffer cache to flush dirty buffers.
The tail queue used for the buffer cache was not initialized before
dropping into gjournal_check(). Move the buffer initialization earlier
so that it has been done before calling gjournal_check().

Reported by:  crypt47, nvass
Fix by:       Robert Wing
Tested by:    Robert Wing
PR:           255030
PR:           255979
MFC after:    3 days
Sponsored by: Netflix
This commit is contained in:
Kirk McKusick 2021-05-21 13:41:40 -07:00
parent fdbc86cf79
commit f190f9193b
2 changed files with 1 additions and 1 deletions

View File

@ -272,6 +272,7 @@ checkfilesys(char *filesys)
* exit status will cause a foreground check to be run. * exit status will cause a foreground check to be run.
*/ */
sblock_init(); sblock_init();
bufinit();
if (bkgrdcheck) { if (bkgrdcheck) {
if ((fsreadfd = open(filesys, O_RDONLY)) < 0 || readsb(0) == 0) if ((fsreadfd = open(filesys, O_RDONLY)) < 0 || readsb(0) == 0)
exit(3); /* Cannot read superblock */ exit(3); /* Cannot read superblock */

View File

@ -298,7 +298,6 @@ setup(char *dev)
(uintmax_t)numdirs * sizeof(struct inoinfo *)); (uintmax_t)numdirs * sizeof(struct inoinfo *));
goto badsb; goto badsb;
} }
bufinit();
if (sblock.fs_flags & FS_DOSOFTDEP) if (sblock.fs_flags & FS_DOSOFTDEP)
usedsoftdep = 1; usedsoftdep = 1;
else else