Fsck_ufs was using an int rather than a ufs2_daddr_t to store the

alternate superblock location when given in the -b option. When int
is 32-bits, block numbers larger than 2^32 would get truncated. This
commit changes the storage fpr the alternate superblock location
to a ufs2_daddr_t.

Submitted by: Dmitry Sivachenko <trtrmitya@gmail.com>
This commit is contained in:
Kirk McKusick 2016-08-19 00:03:41 +00:00
parent 11f2a7cd67
commit 6a5972db72
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=304438
4 changed files with 15 additions and 13 deletions

View File

@ -305,7 +305,7 @@ extern u_int real_dev_bsize; /* actual disk sector size, not overridden */
extern char nflag; /* assume a no response */ extern char nflag; /* assume a no response */
extern char yflag; /* assume a yes response */ extern char yflag; /* assume a yes response */
extern int bkgrdflag; /* use a snapshot to run on an active system */ extern int bkgrdflag; /* use a snapshot to run on an active system */
extern int bflag; /* location of alternate super block */ extern ufs2_daddr_t bflag; /* location of alternate super block */
extern int debug; /* output debugging info */ extern int debug; /* output debugging info */
extern int Eflag; /* delete empty data blocks */ extern int Eflag; /* delete empty data blocks */
extern int Zflag; /* zero empty data blocks */ extern int Zflag; /* zero empty data blocks */

View File

@ -77,7 +77,7 @@ u_int real_dev_bsize; /* actual disk sector size, not overridden */
char nflag; /* assume a no response */ char nflag; /* assume a no response */
char yflag; /* assume a yes response */ char yflag; /* assume a yes response */
int bkgrdflag; /* use a snapshot to run on an active system */ int bkgrdflag; /* use a snapshot to run on an active system */
int bflag; /* location of alternate super block */ ufs2_daddr_t bflag; /* location of alternate super block */
int debug; /* output debugging info */ int debug; /* output debugging info */
int Eflag; /* delete empty data blocks */ int Eflag; /* delete empty data blocks */
int Zflag; /* zero empty data blocks */ int Zflag; /* zero empty data blocks */

View File

@ -57,6 +57,7 @@ __FBSDID("$FreeBSD$");
#include <errno.h> #include <errno.h>
#include <fstab.h> #include <fstab.h>
#include <grp.h> #include <grp.h>
#include <inttypes.h>
#include <mntopts.h> #include <mntopts.h>
#include <paths.h> #include <paths.h>
#include <stdint.h> #include <stdint.h>
@ -68,7 +69,7 @@ __FBSDID("$FreeBSD$");
int restarts; int restarts;
static void usage(void) __dead2; static void usage(void) __dead2;
static int argtoi(int flag, const char *req, const char *str, int base); static intmax_t argtoimax(int flag, const char *req, const char *str, int base);
static int checkfilesys(char *filesys); static int checkfilesys(char *filesys);
static int chkdoreload(struct statfs *mntp); static int chkdoreload(struct statfs *mntp);
static struct statfs *getmntpt(const char *); static struct statfs *getmntpt(const char *);
@ -88,8 +89,8 @@ main(int argc, char *argv[])
switch (ch) { switch (ch) {
case 'b': case 'b':
skipclean = 0; skipclean = 0;
bflag = argtoi('b', "number", optarg, 10); bflag = argtoimax('b', "number", optarg, 10);
printf("Alternate super block location: %d\n", bflag); printf("Alternate super block location: %jd\n", bflag);
break; break;
case 'B': case 'B':
@ -98,7 +99,8 @@ main(int argc, char *argv[])
case 'c': case 'c':
skipclean = 0; skipclean = 0;
cvtlevel = argtoi('c', "conversion level", optarg, 10); cvtlevel = argtoimax('c', "conversion level", optarg,
10);
if (cvtlevel < 3) if (cvtlevel < 3)
errx(EEXIT, "cannot do level %d conversion", errx(EEXIT, "cannot do level %d conversion",
cvtlevel); cvtlevel);
@ -121,7 +123,7 @@ main(int argc, char *argv[])
break; break;
case 'm': case 'm':
lfmode = argtoi('m', "mode", optarg, 8); lfmode = argtoimax('m', "mode", optarg, 8);
if (lfmode &~ 07777) if (lfmode &~ 07777)
errx(EEXIT, "bad mode to -m: %o", lfmode); errx(EEXIT, "bad mode to -m: %o", lfmode);
printf("** lost+found creation mode %o\n", lfmode); printf("** lost+found creation mode %o\n", lfmode);
@ -203,13 +205,13 @@ main(int argc, char *argv[])
exit(ret); exit(ret);
} }
static int static intmax_t
argtoi(int flag, const char *req, const char *str, int base) argtoimax(int flag, const char *req, const char *str, int base)
{ {
char *cp; char *cp;
int ret; intmax_t ret;
ret = (int)strtol(str, &cp, base); ret = strtoimax(str, &cp, base);
if (cp == str || *cp) if (cp == str || *cp)
errx(EEXIT, "-%c flag requires a %s", flag, req); errx(EEXIT, "-%c flag requires a %s", flag, req);
return (ret); return (ret);

View File

@ -196,7 +196,7 @@ setup(char *dev)
bflag = 0; bflag = 0;
return(0); return(0);
} }
pwarn("USING ALTERNATE SUPERBLOCK AT %d\n", bflag); pwarn("USING ALTERNATE SUPERBLOCK AT %jd\n", bflag);
bflag = 0; bflag = 0;
} }
if (skipclean && ckclean && sblock.fs_clean) { if (skipclean && ckclean && sblock.fs_clean) {
@ -329,7 +329,7 @@ readsb(int listerr)
} }
if (sblock.fs_magic != FS_UFS1_MAGIC && if (sblock.fs_magic != FS_UFS1_MAGIC &&
sblock.fs_magic != FS_UFS2_MAGIC) { sblock.fs_magic != FS_UFS2_MAGIC) {
fprintf(stderr, "%d is not a file system superblock\n", fprintf(stderr, "%jd is not a file system superblock\n",
bflag); bflag);
return (0); return (0);
} }