--- src/sbin/badsect/badsect.c 2005/02/13 19:22:42 1.7 +++ src/sbin/badsect/badsect.c 2005/02/14 19:18:53 1.8 @@ -94,6 +94,7 @@ main(int argc, char **argv) { daddr_t diskbn; daddr_t number; + dev_t dev; struct stat stbuf, devstat; register struct dirent *dp; DIR *dirp; @@ -142,12 +143,12 @@ main(int argc, char **argv) * bit was lost by bogus sign extensions. */ diskbn = dbtofsb(fs, number); - if ((daddr_t)((dev_t)diskbn) != diskbn) { + dev = (dev_t)diskbn; + if ((daddr_t)dev != diskbn) { printf("sector %ld cannot be represented as a dev_t\n", (long)number); errs++; - } - else if (mknod(*argv, IFMT|0600, (dev_t)diskbn) < 0) { + } else if (mknod(*argv, IFMT | 0600, dev) < 0) { warn("%s", *argv); errs++; } @@ -163,7 +164,11 @@ chkuse(daddr_t blkno, int cnt) daddr_t fsbn, bn; fsbn = dbtofsb(fs, blkno); - if ((int32_t)((unsigned)(fsbn+cnt)) > fs->fs_size) { + if (fs->fs_size < 0 || fsbn + cnt < 0) { + printf("internal error: negative fs size or block number\n"); + return (1); + } + if (fsbn + cnt > fs->fs_size) { printf("block %ld out of range of file system\n", (long)blkno); return (1); }