This fixes non applying patches on buildbots. Signed-off-by: Álvaro Fernández Rojas <noltari@gmail.com> SVN-Revision: 44936
		
			
				
	
	
		
			55 lines
		
	
	
		
			1.7 KiB
		
	
	
	
		
			Diff
		
	
	
	
	
	
			
		
		
	
	
			55 lines
		
	
	
		
			1.7 KiB
		
	
	
	
		
			Diff
		
	
	
	
	
	
From a41fc323f2ef38f884954a4ba3773a296fd809f8 Mon Sep 17 00:00:00 2001
 | 
						|
From: Andreas Bombe <aeb@debian.org>
 | 
						|
Date: Wed, 11 Mar 2015 21:45:04 +0100
 | 
						|
Subject: [PATCH 12/14] fsck.fat: Fix read beyond end of array on FAT12
 | 
						|
 | 
						|
When a FAT12 filesystem contains an odd number of clusters, setting the
 | 
						|
last cluster with set_fat() will trigger a read of the next entry,
 | 
						|
which does not exist in the fat array allocated for this.
 | 
						|
 | 
						|
Round up the allocation to an even number of FAT entries for FAT12 so
 | 
						|
that this is fixed without introducing special casing in get_fat().
 | 
						|
 | 
						|
Signed-off-by: Andreas Bombe <aeb@debian.org>
 | 
						|
---
 | 
						|
 src/fat.c | 14 +++++++++++---
 | 
						|
 1 file changed, 11 insertions(+), 3 deletions(-)
 | 
						|
 | 
						|
diff --git a/src/fat.c b/src/fat.c
 | 
						|
index 027c586..5a92f56 100644
 | 
						|
--- a/src/fat.c
 | 
						|
+++ b/src/fat.c
 | 
						|
@@ -80,7 +80,7 @@ void get_fat(FAT_ENTRY * entry, void *fat, uint32_t cluster, DOS_FS * fs)
 | 
						|
  */
 | 
						|
 void read_fat(DOS_FS * fs)
 | 
						|
 {
 | 
						|
-    int eff_size;
 | 
						|
+    int eff_size, alloc_size;
 | 
						|
     uint32_t i;
 | 
						|
     void *first, *second = NULL;
 | 
						|
     int first_ok, second_ok;
 | 
						|
@@ -96,10 +96,18 @@ void read_fat(DOS_FS * fs)
 | 
						|
 
 | 
						|
     total_num_clusters = fs->clusters + 2UL;
 | 
						|
     eff_size = (total_num_clusters * fs->fat_bits + 7) / 8ULL;
 | 
						|
-    first = alloc(eff_size);
 | 
						|
+
 | 
						|
+    if (fs->fat_bits != 12)
 | 
						|
+	    alloc_size = eff_size;
 | 
						|
+    else
 | 
						|
+	    /* round up to an even number of FAT entries to avoid special
 | 
						|
+	     * casing the last entry in get_fat() */
 | 
						|
+	    alloc_size = (total_num_clusters * 12 + 23) / 24 * 3;
 | 
						|
+
 | 
						|
+    first = alloc(alloc_size);
 | 
						|
     fs_read(fs->fat_start, eff_size, first);
 | 
						|
     if (fs->nfats > 1) {
 | 
						|
-	second = alloc(eff_size);
 | 
						|
+	second = alloc(alloc_size);
 | 
						|
 	fs_read(fs->fat_start + fs->fat_size, eff_size, second);
 | 
						|
     }
 | 
						|
     if (second && memcmp(first, second, eff_size) != 0) {
 | 
						|
-- 
 | 
						|
1.9.1
 | 
						|
 |