Module Name:    src
Committed By:   mlelstv
Date:           Tue Feb 16 18:57:54 UTC 2010

Modified Files:
        src/usr.sbin/dumplfs: dumplfs.c

Log Message:
Read the padded superblocks to avoid problems with disks that have
larger sectors than 512 Bytes.


To generate a diff of this commit:
cvs rdiff -u -r1.37 -r1.38 src/usr.sbin/dumplfs/dumplfs.c

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/usr.sbin/dumplfs/dumplfs.c
diff -u src/usr.sbin/dumplfs/dumplfs.c:1.37 src/usr.sbin/dumplfs/dumplfs.c:1.38
--- src/usr.sbin/dumplfs/dumplfs.c:1.37	Mon Jul 21 13:36:58 2008
+++ src/usr.sbin/dumplfs/dumplfs.c	Tue Feb 16 18:57:53 2010
@@ -1,4 +1,4 @@
-/*	$NetBSD: dumplfs.c,v 1.37 2008/07/21 13:36:58 lukem Exp $	*/
+/*	$NetBSD: dumplfs.c,v 1.38 2010/02/16 18:57:53 mlelstv Exp $	*/
 
 /*-
  * Copyright (c) 1991, 1993
@@ -40,7 +40,7 @@
 #if 0
 static char sccsid[] = "@(#)dumplfs.c	8.5 (Berkeley) 5/24/95";
 #else
-__RCSID("$NetBSD: dumplfs.c,v 1.37 2008/07/21 13:36:58 lukem Exp $");
+__RCSID("$NetBSD: dumplfs.c,v 1.38 2010/02/16 18:57:53 mlelstv Exp $");
 #endif
 #endif /* not lint */
 
@@ -136,6 +136,7 @@
 	struct lfs lfs_sb1, lfs_sb2, *lfs_master;
 	daddr_t seg_addr, idaddr, sbdaddr;
 	int ch, do_allsb, do_ientries, do_segentries, fd, segnum;
+	void *sbuf;
 
 	do_allsb = 0;
 	do_ientries = 0;
@@ -178,9 +179,14 @@
 	if ((fd = open(special, O_RDONLY, 0)) < 0)
 		err(1, "%s", special);
 
+	sbuf = malloc(LFS_SBPAD);
+	if (sbuf == NULL)
+		err(1, "malloc");
+
 	if (sbdaddr == 0x0) {
 		/* Read the proto-superblock */
-		get(fd, LFS_LABELPAD, &(lfs_sb1.lfs_dlfs), sizeof(struct dlfs));
+		get(fd, LFS_LABELPAD, sbuf, LFS_SBPAD);
+		memcpy(&(lfs_sb1.lfs_dlfs), sbuf, sizeof(struct dlfs));
 
 		/* If that wasn't the real first sb, get the real first sb */
 		if (lfs_sb1.lfs_version > 1 &&
@@ -194,7 +200,8 @@
 	 	*/
 		get(fd,
 		    fsbtobyte(&lfs_sb1, lfs_sb1.lfs_sboffs[1]),
-		    &(lfs_sb2.lfs_dlfs), sizeof(struct dlfs));
+		    sbuf, LFS_SBPAD);
+		memcpy(&(lfs_sb2.lfs_dlfs), sbuf, sizeof(struct dlfs));
 	
 		lfs_master = &lfs_sb1;
 		if (lfs_sb1.lfs_version > 1) {
@@ -212,11 +219,13 @@
 		}
 	} else {
 		/* Read the first superblock */
-		get(fd, dbtob((off_t)sbdaddr), &(lfs_sb1.lfs_dlfs),
-		    sizeof(struct dlfs));
+		get(fd, dbtob((off_t)sbdaddr), sbuf, LFS_SBPAD);
+		memcpy(&(lfs_sb1.lfs_dlfs), sbuf, sizeof(struct dlfs));
 		lfs_master = &lfs_sb1;
 	}
 
+	free(sbuf);
+
 	/* Compatibility */
 	if (lfs_master->lfs_version == 1) {
 		lfs_master->lfs_sumsize = LFS_V1_SUMMARY_SIZE;

Reply via email to