qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Qemu-devel] [PATCH][VVFAT] Print meaningful error on oversized director


From: Paul Bolle
Subject: [Qemu-devel] [PATCH][VVFAT] Print meaningful error on oversized directories
Date: Wed, 05 Nov 2008 15:00:38 +0100

There are size limits for directories to be used for vvfat disk images.
These size limits seem to be undocumented. Moreover, going over those
size limits will return in a cryptic assert error, which basically hides
the actual problem.

Below is a patch to correct that.

Paul Bolle
---    
Currently trying to turn an oversized directory into a VVFAT image will
result in a cryptic error (and an abort):
  qemu: block-vvfat.c:97: array_get: Assertion `index < array->next' failed.
  Aborted
    
Turn this into an actually useful error message:
  Directory does not fit in FAT16 (capacity 504MB)
  qemu: could not open disk image fat:$DIR/
    
Signed-off-by: Paul Bolle <address@hidden>

diff --git a/block-vvfat.c b/block-vvfat.c
index 9e2841a..5fcf746 100644
--- a/block-vvfat.c
+++ b/block-vvfat.c
@@ -890,7 +890,6 @@ static int init_directories(BDRVVVFATState* s,
     s->path = mapping->path;
 
     for (i = 0, cluster = 0; i < s->mapping.next; i++) {
-       int j;
        /* MS-DOS expects the FAT to be 0 for the root directory
         * (except for the media byte). */
        /* LATER TODO: still true for FAT32? */
@@ -923,20 +922,25 @@ static int init_directories(BDRVVVFATState* s,
 
        assert(mapping->begin < mapping->end);
 
+       /* next free cluster */
+       cluster = mapping->end;
+
+       if(cluster > s->cluster_count) {
+           fprintf(stderr,"Directory does not fit in FAT%d (capacity %s)\n",
+                   s->fat_type,
+                   s->fat_type == 12 ? s->sector_count == 2880 ? "1.44 MB"
+                                                               : "2.88 MB"
+                                     : "504MB");
+           return -EINVAL;
+       }
+
        /* fix fat for entry */
        if (fix_fat) {
+           int j;
            for(j = mapping->begin; j < mapping->end - 1; j++)
                fat_set(s, j, j+1);
            fat_set(s, mapping->end - 1, s->max_fat_value);
        }
-
-       /* next free cluster */
-       cluster = mapping->end;
-
-       if(cluster > s->cluster_count) {
-           fprintf(stderr,"Directory does not fit in FAT%d\n",s->fat_type);
-           return -1;
-       }
     }
 
     mapping = array_get(&(s->mapping), 0);






reply via email to

[Prev in Thread] Current Thread [Next in Thread]