]> err.no Git - util-linux/commitdiff
fsck.minix: fix broken zone checking
authorKarel Zak <kzak@redhat.com>
Thu, 15 Oct 2009 12:14:32 +0000 (14:14 +0200)
committerKarel Zak <kzak@redhat.com>
Thu, 15 Oct 2009 12:14:32 +0000 (14:14 +0200)
This bug has been introduced by commit
95356e8b744439336925eeb36f01399f1ee8a5e9.

The fsck.minix code assumes that isset() macro returns boolean,
unfortunately the generic implementation from libc returns integer.

This patch also add a fallback for the bitmap macros to include/bitops.h.

Reported-by: "Andries E. Brouwer" <Andries.Brouwer@cwi.nl>
Signed-off-by: Karel Zak <kzak@redhat.com>
disk-utils/fsck.minix.c
disk-utils/mkfs.minix.c
include/bitops.h

index c9bd6535913901532212182a7fd363485b46a14c..31b5ef6c24c64fb2594b6c4a586ac2ffb91d7cbb 100644 (file)
 #include <termios.h>
 #include <mntent.h>
 #include <sys/stat.h>
-#include <sys/param.h>
 #include <signal.h>
 
 #include "minix.h"
 #include "nls.h"
 #include "pathnames.h"
+#include "bitops.h"
 
 #define ROOT_INO 1
 
@@ -166,8 +166,8 @@ static unsigned char * zone_count = NULL;
 static void recursive_check(unsigned int ino);
 static void recursive_check2(unsigned int ino);
 
-#define inode_in_use(x) (isset(inode_map,(x)))
-#define zone_in_use(x) (isset(zone_map,(x)-FIRSTZONE+1))
+#define inode_in_use(x) (isset(inode_map,(x)) != 0)
+#define zone_in_use(x) (isset(zone_map,(x)-FIRSTZONE+1) != 0)
 
 #define mark_inode(x) (setbit(inode_map,(x)),changed=1)
 #define unmark_inode(x) (clrbit(inode_map,(x)),changed=1)
index ebef5188edfb9fde53a34b0c8f46d80e73b303eb..391f09b843ec99f6f143135a3adacada2729e946 100644 (file)
@@ -68,7 +68,6 @@
 #include <stdlib.h>
 #include <termios.h>
 #include <sys/stat.h>
-#include <sys/param.h>
 #include <mntent.h>
 #include <getopt.h>
 
@@ -76,6 +75,7 @@
 #include "minix.h"
 #include "nls.h"
 #include "pathnames.h"
+#include "bitops.h"
 
 #define MINIX_ROOT_INO 1
 #define MINIX_BAD_INO 2
@@ -131,8 +131,7 @@ static unsigned short good_blocks_table[MAX_GOOD_BLOCKS];
 static int used_good_blocks = 0;
 static unsigned long req_nr_inodes = 0;
 
-#define inode_in_use(x) (isset(inode_map,(x)))
-#define zone_in_use(x) (isset(zone_map,(x)-FIRSTZONE+1))
+#define zone_in_use(x) (isset(zone_map,(x)-FIRSTZONE+1) != 0)
 
 #define mark_inode(x) (setbit(inode_map,(x)))
 #define unmark_inode(x) (clrbit(inode_map,(x)))
index e6eaff18cd9c5a2bfdef2793297351e96ee96260..e283b83555ac3db01421190bcbb8b665576bf1e2 100644 (file)
@@ -4,6 +4,22 @@
 #include <stdint.h>
 #include <endian.h>
 
+/*
+ * Bit map related macros. Usually provided by libc.
+ */
+#include <sys/param.h>
+
+#ifndef NBBY
+# define NBBY            CHAR_BIT
+#endif
+
+#ifndef setbit
+# define setbit(a,i)   ((a)[(i)/NBBY] |= 1<<((i)%NBBY))
+# define clrbit(a,i)   ((a)[(i)/NBBY] &= ~(1<<((i)%NBBY)))
+# define isset(a,i)    ((a)[(i)/NBBY] & (1<<((i)%NBBY)))
+# define isclr(a,i)    (((a)[(i)/NBBY] & (1<<((i)%NBBY))) == 0)
+#endif
+
 #if !defined __BYTE_ORDER || !(__BYTE_ORDER == __LITTLE_ENDIAN) && !(__BYTE_ORDER == __BIG_ENDIAN)
 #error missing __BYTE_ORDER
 #endif