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