bin/142384: sync fsck_msdosfs with OpenBSD

Pedro Giffuni giffunip at tutopia.com
Wed Jan 6 17:00:16 UTC 2010


>Number:         142384
>Category:       bin
>Synopsis:       sync fsck_msdosfs with OpenBSD
>Confidential:   no
>Severity:       non-critical
>Priority:       low
>Responsible:    freebsd-bugs
>State:          open
>Quarter:        
>Keywords:       
>Date-Required:
>Class:          change-request
>Submitter-Id:   current-users
>Arrival-Date:   Wed Jan 06 17:00:15 UTC 2010
>Closed-Date:
>Last-Modified:
>Originator:     Pedro Giffuni
>Release:        8-0 Release
>Organization:
>Environment:
FreeBSD mogwai.giffuni.net 8.0-RELEASE FreeBSD 8.0-RELEASE #12: Tue Dec  1 23:31:27 UTC 2009     pedro at mogwai.giffuni.net:/usr/src/sys/i386/compile/GENERIC  i386

>Description:
Take some minor changes from OpenBSD's fsck_msdos. In particular:

Revision 1.13 (boot.c)
Check reads and lseek correctly for unsigned return

Revision 1.17 (fat.c) - Partial
use calloc() to avoid malloc(n * m) overflow
>How-To-Repeat:
Unfortunately someone has to review this carefully since fsck_msdosfs doesn't
seem to work properly on my system:
mogwai# fsck_msdosfs -p /dev/da0s1
Can't open (No such file or directory)
/dev/ad0s1: UNEXPECTED INCONSISTENCY; RUN fsck_msdosfs MANUALLY.

>Fix:
diff -ru fsck_msdosfs.orig/boot.c fsck_msdosfs/boot.c
--- fsck_msdosfs.orig/boot.c	2010-01-06 11:07:24.000000000 +0000
+++ fsck_msdosfs/boot.c	2010-01-06 11:19:21.000000000 +0000
@@ -55,9 +55,9 @@
 	u_char block[DOSBOOTBLOCKSIZE];
 	u_char fsinfo[2 * DOSBOOTBLOCKSIZE];
 	u_char backup[DOSBOOTBLOCKSIZE];
-	int ret = FSOK;
+	int n, ret = FSOK;
 	
-	if (read(dosfs, block, sizeof block) < sizeof block) {
+	if ((n=(read(dosfs, block, sizeof block) < sizeof block)) == -1 || n != sizeof block) {
 		perror("could not read boot block");
 		return FSFATAL;
 	}
@@ -106,10 +106,10 @@
 		boot->FSInfo = block[48] + (block[49] << 8);
 		boot->Backup = block[50] + (block[51] << 8);
 
-		if (lseek(dosfs, boot->FSInfo * boot->BytesPerSec, SEEK_SET)
-		    != boot->FSInfo * boot->BytesPerSec
-		    || read(dosfs, fsinfo, sizeof fsinfo)
-		    != sizeof fsinfo) {
+		if ((n = lseek(dosfs, boot->FSInfo * boot->BytesPerSec, SEEK_SET)) == -1
+ 		    || n != boot->FSInfo * boot->BytesPerSec
+ 		    || (n = read(dosfs, fsinfo, sizeof fsinfo)) == -1
+ 		    || n != sizeof fsinfo) {
 			perror("could not read fsinfo block");
 			return FSFATAL;
 		}
@@ -133,10 +133,10 @@
 				fsinfo[0x3fc] = fsinfo[0x3fd] = 0;
 				fsinfo[0x3fe] = 0x55;
 				fsinfo[0x3ff] = 0xaa;
-				if (lseek(dosfs, boot->FSInfo * boot->BytesPerSec, SEEK_SET)
-				    != boot->FSInfo * boot->BytesPerSec
-				    || write(dosfs, fsinfo, sizeof fsinfo)
-				    != sizeof fsinfo) {
+ 				if ((n = lseek(dosfs, boot->FSInfo * boot->BytesPerSec, SEEK_SET)) == -1
+ 				    || n != boot->FSInfo * boot->BytesPerSec
+ 				    || (n = write(dosfs, fsinfo, sizeof fsinfo)) == -1
+				    || n != sizeof fsinfo) {
 					perror("Unable to write FSInfo");
 					return FSFATAL;
 				}
@@ -153,9 +153,10 @@
 				       + (fsinfo[0x1ef] << 24);
 		}
 
-		if (lseek(dosfs, boot->Backup * boot->BytesPerSec, SEEK_SET)
-		    != boot->Backup * boot->BytesPerSec
-		    || read(dosfs, backup, sizeof backup) != sizeof  backup) {
+ 		if ((n = lseek(dosfs, boot->Backup * boot->BytesPerSec, SEEK_SET)) == -1
+ 		    || n != boot->Backup * boot->BytesPerSec
+ 		    || (n = read(dosfs, backup, sizeof backup)) == -1
+ 		    || n != sizeof backup) {
 			perror("could not read backup bootblock");
 			return FSFATAL;
 		}
@@ -235,10 +236,12 @@
 	struct bootblock *boot;
 {
 	u_char fsinfo[2 * DOSBOOTBLOCKSIZE];
-
-	if (lseek(dosfs, boot->FSInfo * boot->BytesPerSec, SEEK_SET)
-	    != boot->FSInfo * boot->BytesPerSec
-	    || read(dosfs, fsinfo, sizeof fsinfo) != sizeof fsinfo) {
+ 	int n;
+  
+ 	if ((n = lseek(dosfs, boot->FSInfo * boot->BytesPerSec, SEEK_SET)) == -1
+ 	    || n != boot->FSInfo * boot->BytesPerSec
+ 	    || (n = read(dosfs, fsinfo, sizeof fsinfo)) == -1
+ 	    || n != sizeof fsinfo) {
 		perror("could not read fsinfo block");
 		return FSFATAL;
 	}
@@ -250,10 +253,10 @@
 	fsinfo[0x1ed] = (u_char)(boot->FSNext >> 8);
 	fsinfo[0x1ee] = (u_char)(boot->FSNext >> 16);
 	fsinfo[0x1ef] = (u_char)(boot->FSNext >> 24);
-	if (lseek(dosfs, boot->FSInfo * boot->BytesPerSec, SEEK_SET)
-	    != boot->FSInfo * boot->BytesPerSec
-	    || write(dosfs, fsinfo, sizeof fsinfo)
-	    != sizeof fsinfo) {
+ 	if ((n = lseek(dosfs, boot->FSInfo * boot->BytesPerSec, SEEK_SET)) == -1
+	    || n != boot->FSInfo * boot->BytesPerSec
+ 	    || (n = write(dosfs, fsinfo, sizeof fsinfo)) == -1
+ 	    || n != sizeof fsinfo) {
 		perror("Unable to write FSInfo");
 		return FSFATAL;
 	}
diff -ru fsck_msdosfs.orig/ext.h fsck_msdosfs/ext.h
--- fsck_msdosfs.orig/ext.h	2010-01-06 11:07:24.000000000 +0000
+++ fsck_msdosfs/ext.h	2010-01-06 11:26:33.000000000 +0000
@@ -82,7 +82,7 @@
 #define FSFIXFAT	64		/* Fix file system FAT */
 
 /*
- * read a boot block in a machine independend fashion and translate
+ * read a boot block in a machine independent fashion and translate
  * it into our struct bootblock.
  */
 int readboot(int, struct bootblock *);
diff -ru fsck_msdosfs.orig/fat.c fsck_msdosfs/fat.c
--- fsck_msdosfs.orig/fat.c	2010-01-06 11:07:24.000000000 +0000
+++ fsck_msdosfs/fat.c	2010-01-06 11:30:23.000000000 +0000
@@ -547,7 +547,8 @@
 	off_t off;
 	int ret = FSOK;
 
-	buffer = malloc(fatsz = boot->FATsecs * boot->BytesPerSec);
+	fatsz = boot->FATsecs * boot->BytesPerSec;
+	buffer = calloc(boot->FATsecs, boot->BytesPerSec);
 	if (buffer == NULL) {
 		perror("No space for FAT");
 		return FSFATAL;


>Release-Note:
>Audit-Trail:
>Unformatted:


More information about the freebsd-bugs mailing list