Date: Wed, 6 Jan 2010 16:50:44 GMT From: Pedro Giffuni <giffunip@tutopia.com> To: freebsd-gnats-submit@FreeBSD.org Subject: bin/142384: sync fsck_msdosfs with OpenBSD Message-ID: <201001061650.o06GoiXv049794@www.freebsd.org> Resent-Message-ID: <201001061700.o06H0F5J077641@freefall.freebsd.org>
next in thread | raw e-mail | index | archive | help
>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@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:
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201001061650.o06GoiXv049794>