From owner-freebsd-bugs@FreeBSD.ORG Wed Jan 6 17:00:16 2010 Return-Path: Delivered-To: freebsd-bugs@hub.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 369BC1065672 for ; Wed, 6 Jan 2010 17:00:16 +0000 (UTC) (envelope-from gnats@FreeBSD.org) Received: from freefall.freebsd.org (freefall.freebsd.org [IPv6:2001:4f8:fff6::28]) by mx1.freebsd.org (Postfix) with ESMTP id 11B3E8FC12 for ; Wed, 6 Jan 2010 17:00:16 +0000 (UTC) Received: from freefall.freebsd.org (localhost [127.0.0.1]) by freefall.freebsd.org (8.14.3/8.14.3) with ESMTP id o06H0F9E077649 for ; Wed, 6 Jan 2010 17:00:15 GMT (envelope-from gnats@freefall.freebsd.org) Received: (from gnats@localhost) by freefall.freebsd.org (8.14.3/8.14.3/Submit) id o06H0F5J077641; Wed, 6 Jan 2010 17:00:15 GMT (envelope-from gnats) Resent-Date: Wed, 6 Jan 2010 17:00:15 GMT Resent-Message-Id: <201001061700.o06H0F5J077641@freefall.freebsd.org> Resent-From: FreeBSD-gnats-submit@FreeBSD.org (GNATS Filer) Resent-To: freebsd-bugs@FreeBSD.org Resent-Reply-To: FreeBSD-gnats-submit@FreeBSD.org, Pedro Giffuni Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 6FF47106566B for ; Wed, 6 Jan 2010 16:50:45 +0000 (UTC) (envelope-from nobody@FreeBSD.org) Received: from www.freebsd.org (www.freebsd.org [IPv6:2001:4f8:fff6::21]) by mx1.freebsd.org (Postfix) with ESMTP id 5F4478FC25 for ; Wed, 6 Jan 2010 16:50:45 +0000 (UTC) Received: from www.freebsd.org (localhost [127.0.0.1]) by www.freebsd.org (8.14.3/8.14.3) with ESMTP id o06GoiMl049797 for ; Wed, 6 Jan 2010 16:50:44 GMT (envelope-from nobody@www.freebsd.org) Received: (from nobody@localhost) by www.freebsd.org (8.14.3/8.14.3/Submit) id o06GoiXv049794; Wed, 6 Jan 2010 16:50:44 GMT (envelope-from nobody) Message-Id: <201001061650.o06GoiXv049794@www.freebsd.org> Date: Wed, 6 Jan 2010 16:50:44 GMT From: Pedro Giffuni To: freebsd-gnats-submit@FreeBSD.org X-Send-Pr-Version: www-3.1 Cc: Subject: bin/142384: sync fsck_msdosfs with OpenBSD X-BeenThere: freebsd-bugs@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: Bug reports List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Wed, 06 Jan 2010 17:00:16 -0000 >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: