Module Name:    src
Committed By:   christos
Date:           Mon Jul  7 18:46:45 UTC 2014

Modified Files:
        src/sbin/fsck_msdos: fat.c

Log Message:
From: http://marc.info/?l=openbsd-tech&m=140234174104724&w=2
Avoid off-by-one on FAT12 filesystems.


To generate a diff of this commit:
cvs rdiff -u -r1.26 -r1.27 src/sbin/fsck_msdos/fat.c

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

Modified files:

Index: src/sbin/fsck_msdos/fat.c
diff -u src/sbin/fsck_msdos/fat.c:1.26 src/sbin/fsck_msdos/fat.c:1.27
--- src/sbin/fsck_msdos/fat.c:1.26	Mon Jul  7 13:55:53 2014
+++ src/sbin/fsck_msdos/fat.c	Mon Jul  7 14:46:45 2014
@@ -1,4 +1,4 @@
-/*	$NetBSD: fat.c,v 1.26 2014/07/07 17:55:53 christos Exp $	*/
+/*	$NetBSD: fat.c,v 1.27 2014/07/07 18:46:45 christos Exp $	*/
 
 /*
  * Copyright (C) 1995, 1996, 1997 Wolfgang Solfrank
@@ -28,7 +28,7 @@
 
 #include <sys/cdefs.h>
 #ifndef lint
-__RCSID("$NetBSD: fat.c,v 1.26 2014/07/07 17:55:53 christos Exp $");
+__RCSID("$NetBSD: fat.c,v 1.27 2014/07/07 18:46:45 christos Exp $");
 #endif /* not lint */
 
 #include <stdlib.h>
@@ -554,13 +554,15 @@ writefat(int fs, struct bootblock *boot,
 		default:
 			if (fat[cl].next == CLUST_FREE)
 				boot->NumFree++;
-			if (cl + 1 < boot->NumClusters
-			    && fat[cl + 1].next == CLUST_FREE)
-				boot->NumFree++;
 			*p++ = (u_char)fat[cl].next;
-			*p++ = (u_char)((fat[cl].next >> 8) & 0xf)
-			       |(u_char)(fat[cl+1].next << 4);
-			*p++ = (u_char)(fat[++cl].next >> 4);
+			*p++ = (u_char)((fat[cl].next >> 8) & 0xf);
+			cl++;
+			if (cl >= boot->NumClusters)
+				break;
+			if (fat[cl].next == CLUST_FREE)
+				boot->NumFree++;
+			*p |= (u_char)(fat[cl + 1].next << 4);
+			*p++ = (u_char)(fat[cl + 1].next >> 4);
 			break;
 		}
 	}

Reply via email to