summaryrefslogtreecommitdiff
path: root/sbin
diff options
context:
space:
mode:
authorTodd C. Miller <millert@cvs.openbsd.org>2017-04-12 15:23:09 +0000
committerTodd C. Miller <millert@cvs.openbsd.org>2017-04-12 15:23:09 +0000
commita672bcbef3d1248080f1bd8d0a808a1b80a5179c (patch)
tree6df561d23db79b5632c847d3ad1e43c22b7f8994 /sbin
parent7cd866c40205ff86ed4b6d44ca65b39924d2798f (diff)
Prevent inosused from wrapping when soft updates is enabled while
scanning the used inode map. The code as written assumes inosused is signed but this is no longer the case. OK deraadt@
Diffstat (limited to 'sbin')
-rw-r--r--sbin/fsck_ffs/pass1.c11
1 files changed, 8 insertions, 3 deletions
diff --git a/sbin/fsck_ffs/pass1.c b/sbin/fsck_ffs/pass1.c
index 02bb8ad32a5..61d5431ecb8 100644
--- a/sbin/fsck_ffs/pass1.c
+++ b/sbin/fsck_ffs/pass1.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: pass1.c,v 1.44 2017/04/10 08:19:12 fcambus Exp $ */
+/* $OpenBSD: pass1.c,v 1.45 2017/04/12 15:23:08 millert Exp $ */
/* $NetBSD: pass1.c,v 1.16 1996/09/27 22:45:15 christos Exp $ */
/*
@@ -116,9 +116,14 @@ pass1(void)
*/
if (preen && usedsoftdep) {
cp = &cg_inosused(&cgrp)[(inosused - 1) / CHAR_BIT];
- for ( ; inosused > 0; inosused -= CHAR_BIT, cp--) {
- if (*cp == 0)
+ for ( ; inosused != 0; cp--) {
+ if (*cp == 0) {
+ if (inosused > CHAR_BIT)
+ inosused -= CHAR_BIT;
+ else
+ inosused = 0;
continue;
+ }
for (i = 1 << (CHAR_BIT - 1); i > 0; i >>= 1) {
if (*cp & i)
break;