Apply less dodgy range checks.
authorChris Pressey <cpressey@dragonflybsd.org>
Mon, 14 Feb 2005 19:18:53 +0000 (19:18 +0000)
committerChris Pressey <cpressey@dragonflybsd.org>
Mon, 14 Feb 2005 19:18:53 +0000 (19:18 +0000)
Requested-by: joerg
sbin/badsect/badsect.c

index 89b4577..0ec5427 100644 (file)
@@ -33,7 +33,7 @@
  * @(#) Copyright (c) 1981, 1983, 1993 The Regents of the University of California.  All rights reserved.
  * @(#)badsect.c       8.1 (Berkeley) 6/5/93
  * $FreeBSD: src/sbin/badsect/badsect.c,v 1.7.2.2 2001/07/30 10:30:04 dd Exp $
- * $DragonFly: src/sbin/badsect/badsect.c,v 1.7 2005/02/13 19:22:42 cpressey Exp $
+ * $DragonFly: src/sbin/badsect/badsect.c,v 1.8 2005/02/14 19:18:53 cpressey Exp $
  */
 
 /*
@@ -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);
        }